vit_soniox

A Dart package for real-time speech-to-text transcription using the Soniox WebSocket API.

Features

  • Real-time transcription with final and non-final token streams
  • Configurable audio format, language hints, speaker diarization, and endpoint detection
  • Bring-your-own WebSocket transport via WebsocketContract

Example

import 'package:vit_soniox/vit_soniox.dart';

void main() {
  final config = SonioxSessionConfig(
    apiKey: 'your-api-key',
    audio: AudioConfig.pcms16le(),
    languageHints: ['en'],
  );

  // CustomWebsocket implements WebsocketContract using your platform's WebSocket library.
  final soniox = SonioxWebsocket(config, websocket: CustomWebsocket());

  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();

  // Stream audio chunks as Uint8List
  // soniox.addAudio(audioChunk);

  // When done:
  // soniox.disconnect();
}

Example App

For a complete working example application, check out vit_soniox_example.

Implementing WebsocketContract

Use web_socket_channel to implement the transport layer:

import 'dart:typed_data';
import 'package:vit_soniox/vit_soniox.dart';
import 'package:web_socket_channel/web_socket_channel.dart';

class CustomWebsocket with WebsocketContract {
  WebSocketChannel? _channel;

  @override
  Future<void> connect(String url) async {
    _channel = WebSocketChannel.connect(Uri.parse(url));
    await _channel!.ready.timeout(Duration(seconds: 5));
  }

  @override
  Stream<String> get stream => _channel!.stream.cast<String>();

  @override
  void send(String data) => _channel?.sink.add(data);

  @override
  void sendBinary(Uint8List data) => _channel?.sink.add(data);

  @override
  void close() => _channel?.sink.close();
}

Libraries

vit_soniox
Support for doing something awesome.