10

iOSで音声認識を勉強しているのですが、メソッド [_recognitionRequest endAudio] を呼び出すたびに、reactionTaskWithRequest で常にエラーが発生しました: メッセージは一番下にあります。

-(void) stopRecording {
if (_disableSpeechSW == YES) {
    return;
}
if (_isAuthorization == NO) {
    return;
}

NSLog(@"stopRecording");

if ([_audioEngine isRunning]) {
    [_audioEngine stop];
    [_recognitionRequest endAudio];
}

}

-(void) startRecording {
..........
[_speechRecognizer recognitionTaskWithRequest:_recognitionRequest
                   resultHandler:^(SFSpeechRecognitionResult *result,NSError *error){
  if (error != nil ) {
     NSLog(@"%@",[error description]);
  }
  else {
   ..........
  }
}];}

[ユーティリティ] +[AFAggregator logDictationFailedWithError:] Error Domain=kAFAssistantErrorDomain Code=203 "Retry" UserInfo={NSLocalizedDescription=Retry, NSUnderlyingError=0x17424c690 {Error Domain=SiriSpeechErrorDomain Code=1 "(null)"}}

4

3 に答える 3

8

Siri の音声制限に関する詳細については、この投稿を参照してください: iOS 10 の音声認識の制限

Use my function below to stop speech recognization. Hope its works.

-(void)stopRecording{

    dispatch_async(dispatch_get_main_queue(), ^{

        if(audioEngine.isRunning){
            [inputNode removeTapOnBus:0];
            [inputNode reset];
            [audioEngine stop];
            [recognitionRequest endAudio];
            [recognitionTask cancel];
            recognitionTask = nil;
            recognitionRequest = nil;
        }
    });
}
于 2017-06-09T09:48:00.380 に答える
3

エラーとして偽装されていても、正確にはエラーではないことを誰かが示しているように。実際に起こったことは、認識時間が Apple が API に設定した 1 分の制限よりも長く、1 分の制限中に単語が認識されなかったということです。
解決策は、タイマーを追加して、60 秒未満の時間が経過すると認識を停止することです。

var timerSST = timerSST = Timer.scheduledTimer(timeInterval: value, target: self, selector: #selector(fire), userInfo: nil, repeats: true)

ビュー コントローラーの起動時にタイマーを開始します。タイマーが切れると、次のように呼び出します。

@objc func fire()
{
    if(startedSTT) {
        stopRecording()
    }
        // restart it
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            do {
                try self.startRecording()
            } catch let error {
                print("There was a problem starting recording: \(error.localizedDescription)")
            }
        }


}  

停止方法の例を次に示します。

    fileprivate func stopRecording() {
    audioEngine.stop()
    request.endAudio()
    recognitionTask?.cancel()
    //recognitionTask?.finish()
    audioEngine.inputNode.removeTap(onBus: 0);
    audioEngine.inputNode.reset()
    startedSTT = false
}

停止が適切に行われていない場合、認識のために記録を再開することはできません。次の行に注意してください。

recognitionTask?.cancel() vs .finish  

そして、inputNode のリセット:

audioEngine.inputNode.removeTap(onBus: 0);
audioEngine.inputNode.reset()

これらの手法を使用して、このように連続して音声認識を行うことができました。
それが役に立てば幸い!

デビッド

于 2019-07-03T23:54:06.857 に答える