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 - The API key authenticates the CONNECTION (
connect(url, apiKey: ...)); it is never sent in the start message
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.