Skip to main content

vit_soniox 2.0.0 copy "vit_soniox: ^2.0.0" to clipboard
vit_soniox: ^2.0.0 copied to clipboard

Real-time speech-to-text transcription using the Soniox WebSocket API, with support for final/non-final tokens and speaker diarization.

example/vit_soniox_example.dart

import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';

import 'package:vit_soniox/vit_soniox.dart';

Future<void> main() async {
  final config = SonioxSessionConfig(
    apiKey: 'demo-api-key',
    audio: AudioConfig.pcms16le(),
    languageHints: ['pt'],
  );

  final soniox = SonioxWebsocket(config, websocket: MockWebSocket());

  soniox.connectionStream.listen((connected) {
    print('[Connection] ${connected ? 'Connected' : 'Disconnected'}');
  });

  soniox.nonFinaltranscription.listen((text) {
    print('[Partial] $text');
  });

  soniox.finalTranscription.listen((text) {
    print('[Final]   $text');
  });

  soniox.errors.listen((error) {
    print('[Error] ${error.code}: ${error.message}');
  });

  soniox.connect();

  await Future.delayed(Duration(seconds: 3));

  soniox.disconnect();
}

// Mock WebSocket that simulates Soniox server responses.
class MockWebSocket with WebsocketContract {
  final _controller = StreamController<String>.broadcast();

  @override
  Stream<String> get stream => _controller.stream;

  @override
  Future<void> connect(String url, {String? apiKey}) async {
    await Future.delayed(Duration(milliseconds: 100));

    _simulateResponses();
  }

  @override
  void send(String data) {
    // sending config here
  }

  @override
  void sendBinary(Uint8List data) {
    print('[MockWebSocket] Sending ${data.length} bytes of audio.');
  }

  @override
  void close() {
    print('[MockWebSocket] Connection close.');
    _controller.close();
  }

  void _simulateResponses() {
    final responses = [
      {
        'tokens': [
          {
            'text': 'Hello',
            'is_final': false,
            'confidence': 0.9,
            'start_ms': 0,
            'end_ms': 300,
          },
        ],
      },
      {
        'tokens': [
          {
            'text': 'Hello',
            'is_final': true,
            'confidence': 0.95,
            'start_ms': 0,
            'end_ms': 300,
          },
          {
            'text': ' world',
            'is_final': true,
            'confidence': 0.92,
            'start_ms': 300,
            'end_ms': 700,
          },
        ],
      },
      {
        'tokens': [
          {
            'text': 'how',
            'is_final': false,
            'confidence': 0.88,
            'start_ms': 800,
            'end_ms': 1000,
          },
        ],
      },
      {
        'tokens': [
          {
            'text': 'how are',
            'is_final': true,
            'confidence': 0.91,
            'start_ms': 800,
            'end_ms': 1200,
          },
          {
            'text': ' you?',
            'is_final': true,
            'confidence': 0.93,
            'start_ms': 1200,
            'end_ms': 1600,
          },
        ],
      },
    ];

    var delay = 300;
    for (final response in responses) {
      Future.delayed(Duration(milliseconds: delay), () {
        if (!_controller.isClosed) {
          _controller.add(jsonEncode(response));
        }
      });
      delay += 400;
    }
  }
}
0
likes
160
points
80
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Real-time speech-to-text transcription using the Soniox WebSocket API, with support for final/non-final tokens and speaker diarization.

Repository (GitHub)
View/report issues

License

MIT (license)

More

Packages that depend on vit_soniox