vit_soniox 1.0.0
vit_soniox: ^1.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) 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;
}
}
}