@@ -5,7 +5,6 @@ import 'dart:typed_data';
55import 'package:flutter/foundation.dart' ;
66import 'package:flutter/material.dart' ;
77import 'package:record/record.dart' ;
8- // import 'package:path_provider/path_provider.dart';
98
109import 'package:sherpa_onnx/sherpa_onnx.dart' as sherpa_onnx;
1110
@@ -200,20 +199,24 @@ class SpeechState extends ChangeNotifier {
200199
201200 Future <void > initialize () async {
202201 if (! isInitialized) {
203- // init online recognizer
204- sherpa_onnx.initBindings ();
205- onlineRecognizer = await createOnlineRecognizer ();
206- onlineStream = onlineRecognizer? .createStream ();
202+ try {
203+ // init online recognizer
204+ sherpa_onnx.initBindings ();
205+ onlineRecognizer = await createOnlineRecognizer ();
206+ onlineStream = onlineRecognizer? .createStream ();
207207
208- // init offline recognizer
209- offlineRecognizer = await createOfflineRecognizer ();
208+ // init offline recognizer
209+ offlineRecognizer = await createOfflineRecognizer ();
210210
211- // init speaker identification components
212- speakerExtractor = await createSpeakerExtractor ();
213- speakerManager = sherpa_onnx.SpeakerEmbeddingManager (speakerExtractor! .dim);
211+ // init speaker identification components
212+ speakerExtractor = await createSpeakerExtractor ();
213+ speakerManager = sherpa_onnx.SpeakerEmbeddingManager (speakerExtractor! .dim);
214214
215- isInitialized = true ;
216- notifyListeners ();
215+ isInitialized = true ;
216+ notifyListeners ();
217+ } catch (e) {
218+ debugPrint ('Sherpa initialization failed: $e ' );
219+ }
217220 }
218221 }
219222
@@ -256,13 +259,17 @@ class SpeechState extends ChangeNotifier {
256259 start: start,
257260 end: start, // Will be updated when segment ends
258261 ));
262+
263+ debugPrint ('Added new segment $currentIndex : "$text " (${start .toStringAsFixed (2 )}s - ${start .toStringAsFixed (2 )}s)' );
259264 }
260265
261266 // Update an existing segment with improved recognition
262267 void _updateRecognizedSegment (int index, String newText, {String ? speakerId, Float32List ? embedding}) {
263268 final segmentIndex = recognizedSegments.indexWhere ((s) => s.index == index);
264269 if (segmentIndex != - 1 ) {
265- recognizedSegments[segmentIndex].text = newText;
270+ if (newText.trim ().isNotEmpty) {
271+ recognizedSegments[segmentIndex].text = newText;
272+ }
266273 recognizedSegments[segmentIndex].isProcessed = true ;
267274
268275 if (speakerId != null ) {
@@ -286,19 +293,6 @@ class SpeechState extends ChangeNotifier {
286293 }
287294
288295 try {
289- // // Check if the segment exists in recognizedSegments
290- // final segmentIndex = recognizedSegments.indexWhere((s) => s.index == segment.index);
291- // if (segmentIndex == -1) {
292- // debugPrint('Segment ${segment.index} not found in recognizedSegments, creating placeholder');
293- // // Create a placeholder if it doesn't exist
294- // recognizedSegments.add(RecognizedSegment(
295- // index: segment.index,
296- // text: "",
297- // start: segment.start,
298- // end: segment.end,
299- // ));
300- // }
301-
302296 // Perform offline speech recognition
303297 final offlineStream = offlineRecognizer! .createStream ();
304298
@@ -348,15 +342,7 @@ class SpeechState extends ChangeNotifier {
348342 speakerId: speakerId,
349343 embedding: embedding,
350344 );
351- } else {
352- // debugPrint('Empty text result for segment ${segment.index}, only updating speaker ID');
353- // _updateRecognizedSegment(
354- // segment.index,
355- // result.text,
356- // speakerId: speakerId,
357- // embedding: embedding,
358- // );
359- }
345+ }
360346
361347 // Free resources
362348 offlineStream.free ();
@@ -420,10 +406,8 @@ class SpeechState extends ChangeNotifier {
420406 try {
421407 if (await audioRecorder.hasPermission ()) {
422408 // Reset speakers for new recording
423- // speakerManager?.free();
424- // speakerManager = sherpa_onnx.SpeakerEmbeddingManager(speakerExtractor!.dim);
425409 currentSpeakerCount = 0 ;
426- // recognizedSegments.clear();
410+ recognizedSegments.clear ();
427411
428412 // Create a path for saving the recording
429413 recordingFilePath = await _createRecordingFilePath ();
@@ -442,7 +426,7 @@ class SpeechState extends ChangeNotifier {
442426
443427 recordState = RecordState .record;
444428 controller.value = TextEditingValue (
445- text: "Ready to record ..."
429+ text: "Listening ..."
446430 );
447431 notifyListeners ();
448432
@@ -521,6 +505,12 @@ class SpeechState extends ChangeNotifier {
521505 currentIndex += 1 ;
522506 }
523507 },
508+ onError: (error) {
509+ debugPrint ('Error from audio stream: $error ' );
510+ },
511+ onDone: () {
512+ debugPrint ('Audio stream done' );
513+ },
524514 );
525515 }
526516 } catch (e) {
@@ -712,4 +702,4 @@ class SpeechState extends ChangeNotifier {
712702 speakerManager? .free ();
713703 super .dispose ();
714704 }
715- }
705+ }
0 commit comments