#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?