【发布时间】:2017-09-25 08:31:01
【问题描述】:
我有一个用 XCode/objective C 开发的 iOS 应用程序。 它使用 iOS Speech API 来处理连续的语音识别。 它正在工作,但我想在语音开始时将麦克风图标变为红色,我还想检测语音何时结束。
我实现了接口 SFSpeechRecognitionTaskDelegate,它给出了回调 onDetectedSpeechStart 和 speechRecognitionTask:didHypothesizeTranscription: 但这些直到处理第一个单词的结尾才发生,而不是在语音的开头。
我想检测语音的开头(或任何噪音)。我认为 installTapOnBus 应该可以:来自 AVAudioPCMBuffer 但我不确定如何检测这是否是静音与可能是语音的噪音。
此外,语音 API 不会在人停止说话时发出事件,即静音检测,它只会记录直到超时。我有一个通过检查最后一次触发事件之间的时间来检测静音的技巧,不确定它们是否是更好的方法。
代码在这里,
NSError * outError;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&outError];
[audioSession setMode: AVAudioSessionModeMeasurement error:&outError];
[audioSession setActive: true withOptions: AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&outError];
SFSpeechAudioBufferRecognitionRequest* speechRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
if (speechRequest == nil) {
NSLog(@"Unable to create SFSpeechAudioBufferRecognitionRequest.");
return;
}
audioEngine = [[AVAudioEngine alloc] init];
AVAudioInputNode* inputNode = [audioEngine inputNode];
speechRequest.shouldReportPartialResults = true;
// iOS speech does not detect end of speech, so must track silence.
lastSpeechDetected = -1;
speechTask = [speechRecognizer recognitionTaskWithRequest: speechRequest delegate: self];
[inputNode installTapOnBus:0 bufferSize: 4096 format: [inputNode outputFormatForBus:0] block:^(AVAudioPCMBuffer* buffer, AVAudioTime* when) {
long millis = [[NSDate date] timeIntervalSince1970] * 1000;
if (lastSpeechDetected != -1 && ((millis - lastSpeechDetected) > 1000)) {
lastSpeechDetected = -1;
[speechTask finish];
return;
}
[speechRequest appendAudioPCMBuffer: buffer];
}];
[audioEngine prepare];
[audioEngine startAndReturnError: &outError];
【问题讨论】:
-
你试过我的答案了吗?
标签: ios objective-c speech-recognition