Как получить последнее произнесенное слово от SFSpeechRecognitionResult

#ios #swift #objective-c #speech-recognition #speech-to-text

#iOS #быстрый #цель-c #распознавание речи #преобразование речи в текст

Вопрос:

Я реализую процесс распознавания речи для преобразования с помощью SFSpeechRecognizer. Необходимо реализовать опцию стирания, чтобы удалить последний символ. Но SFSpeechRecognitionResult, result.bestTranscription.formattedString всегда возвращает целую строку от начала до конца. Есть ли какой-либо способ получить последнее произнесенное слово из SFSpeechRecognitionResult без остановки и запуска распознавания?

Мой код реализации

 - (void)startListening{ // Initialize the AVAudioEngine audioEngine = [[AVAudioEngine alloc] init]; _speechSynthesizer = [[AVSpeechSynthesizer alloc] init];  // Make sure there's not a recognition task already running if (recognitionTask) {  [_SFSpeechAudioBufferRecRequest endAudio];  [audioEngine stop];  // [recognitionTask cancel];  // recognitionTask = nil; } // Starts an AVAudio Session NSError *error; AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryRecord error:amp;error]; [audioSession setMode:AVAudioSessionModeMeasurement error:amp;error]; [audioSession setActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:amp;error];  // Starts a recognition process, in the block it logs the input or stops the audio // process if there's an error. _SFSpeechAudioBufferRecRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; AVAudioInputNode *inputNode = audioEngine.inputNode; _SFSpeechAudioBufferRecRequest.shouldReportPartialResults = YES; recognitionTask = [speechRecognizer recognitionTaskWithRequest:_SFSpeechAudioBufferRecRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error)  {  if (result)  {  // Whatever you say in the microphone after pressing the button should be being logged  // in the console.  NSLog(@"RESULT:%@",result.bestTranscription.formattedString);  }  if (error)  {  NSLog(@"ERROR %@", error);  @try  {  [audioEngine stop];  [inputNode removeTapOnBus:0];  _SFSpeechAudioBufferRecRequest = nil;  recognitionTask = nil;  }  @catch (NSException *exception)  {  NSLog(@"EXCEPTION ======== %@",exception);  }  @finally  {  }  } }];  // Sets the recording format AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0]; [inputNode installTapOnBus:0 bufferSize:2048 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {  [_SFSpeechAudioBufferRecRequest appendAudioPCMBuffer:buffer]; }]; // Starts the audio engine, i.e. it starts listening. [audioEngine prepare]; [audioEngine startAndReturnError:amp;error];}  

Заранее спасибо!

Ответ №1:

Вы можете поработать с выходной строкой и получить последнее слово. Код будет выглядеть примерно так, как показано ниже:

 -(NSString *)getLastWord:(NSString *)outputString {  NSRange range = [outputString rangeOfString: @" " options:NSBackwardsSearch];  NSString *lastWord = [outputString substringFromIndex:range.location  1];  return lastWord; }  

Вы можете передать свой result.bestTranscription.formattedString метод выше и получить желаемый результат.

ПРИМЕЧАНИЕ: Просто убедитесь, что вы будете вызывать этот метод только тогда, когда длина result.bestTranscription.formattedString больше 0, а не НОЛЬ.

Комментарии:

1. если я сначала удалю последний символ из 1234. Обновлена строка как 123. После того, как я сказал 456789, результат.bestTranscription.formattedString возвращает 1234456789. Как с этим справиться?

2. С 1234456789 вы хотите удалить 9, верно?

3. Получение удаленного значения из result.bestTranscription.formattedString 123(4)456789. Каждый раз не удается найти удаленное значение.

4. Что делать, если вы сохраняете массив удаленных символов в памяти? В случае 1234 года вы сохраняете 3, а затем получаете 1234456789 , вы знаете, что все еще хотите удалить 4, а может быть, и 9?