2017-02-16 14 views
1

私はテキストビューでSpeechフレームワークの使用を簡素化しようとしています。私は、テキストビュー、スタートアップコードまたは他のアクションを入力することに基づいて、コードで音声認識プロセスを簡単に開始することができます。しかし、私はまた、ユーザーの手を触れることなく音声認識を終了したい。私は音声フレームワークでこれを行うための方法があることを示すために何かを見つけることができませんでした。私は、転写を止めるトリガーとなる言葉を定義し、転写から単語を取り除くことによって、それを達成する方法を作り出しました。それはうまくいきますが、もちろんその言葉を話すことはできません。このコンセプトを扱う良い方法はありますか? iOSの10、スウィフト3、Xcodeの8.2.1Swift3で認識を停止しないで停止

はここrecognitionTaskのコードの一部です:

private var bufferedString = String() 
private var stopWord = "myStopWord" 

recognitionRequest.shouldReportPartialResults = true 
let startText = self.sayTextView.text 
bufferedString = "" 

recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in 
    var finished = false 

    if let result = result { 

     self.bufferedString = startText! + result.bestTranscription.formattedString 
      self.sayTextView.text = self.bufferedString 
      finished = result.isFinal 

    }//if let result 

    //for testing 
    self.stopWord = "Relationship" 
    //for testing 

    if self.bufferedString.lowercased().contains(self.stopWord.lowercased()) { 
     print("buffered string contains \(self.stopWord)") 

     if let stopWordRange = self.bufferedString.lowercased().range(of: self.stopWord.lowercased()) { 
      self.bufferedString.replaceSubrange(stopWordRange, with: "") 
      self.sayTextView.text = self.bufferedString 
     }//if let 

     self.stopRecording(self) 

    }//if contains - look for stopWord 

    if error != nil || finished { 

     self.audioEngine.stop() 
     inputNode.removeTap(onBus: 0) 

     self.recognitionRequest = nil 
     self.recognitionTask = nil 
     self.startRecordingButton.isEnabled = true 

    }//if error 
})//recognitionTask resultHandler 
+0

認識をいつ停止するかを定義する必要があります。開始直後に停止しますか?その後、それを始める感覚は何ですか?それとも、時間がたってもそれを止めたいのですか?タイムアウトが役立つはずです。 –

+0

ユーザーが指定した単語を言うときに停止したい。上記のコードでは、ユーザーが "Relationship"と言うと、それは停止します。その後、関係はテキストから削除されます。私のコードがなければ、ユーザーは「カンマ」と言ってカンマを得ることができます。ユーザーは「疑問符」と言って疑問符をつけることができます。私はストップワードへの言及を見つけることができません。 – user2698617

+0

NSTimerを試しましたか? – Devang

答えて

2

ユーザーが期待通りに話して停止した場合にはisfinalフラグがtrueになっていないようです。私はこれがAppleが望んでいた動作だと思う。なぜなら、 "User stops talk"というイベントは未定義のイベントだからだ。

私はあなたの目標を達成するための最も簡単な方法は以下のであると信じている:

  • あなたは、ユーザーがあなたよりも長い時間のために話をしていない場合を意味し、「沈黙の間隔を」estabilishする必要が彼は話しを止めた(すなわち2秒)。

  • オーディオセッションの開始時にタイマーを作成します。

VARタイマー= NSTimer.scheduledTimerWithTimeInterval(2、ターゲット:自己セレクタ: "didFinishTalk"、のUserInfo:nilで、繰り返される:偽)

  • あなたはrecognitionTask無効に新しいトランスクリプションを取得し、(あなたのタイマー

    timer.invalidateを再起動します)タイマーがタイムアウトすると、ユーザーは2秒間から話をしないことを意味します。タイマーが終了すると、タイマーはNTSimer.scheduledTimerWithTimeInterval(2、ターゲット:セル、セレクター:「didFinishTalk」、userInfo:nil、繰り返し:false)を返す。

  • オーディオセッションを安全に終了して終了することができます

関連する問題