2012-06-12 55 views
1

我想要構建一個Android應用程序,它將識別我的聲音,將其轉換爲文本,並顯示我剛剛講話的內容。我可以通過使用一個按鈕來爲我啓動語音識別器。但是現在我只想讓它在我的聲音基礎上工作。基於語音(噪聲)強度的語音識別?

應用程序應該觸發語音識別器,並且只有當我開始講話時纔開始聆聽我,並且當它感應到沉默時應該停止聆聽。就像湯姆應用程序的功能一樣。它會記錄聲音,但我想用聲音識別器識別它。有些事情是這樣的:

if(no silense) 
    Launch Recognizer 
else if(silence) 
    Stop Recognizer 
Show toast 

的主要問題是,我怎麼能當用戶推出語音識別之前說什麼或不出來。有什麼辦法來感覺噪音強度.. ??其次,有沒有什麼辦法在後臺啓動語音識別器......?

是否有可能在後臺服務中檢測到音頻信號(某人開始講話),然後立即啓動語音識別器來識別語音。

+0

會說話的湯姆也改變其他聲音,不僅聲音,所以它可能會不斷記錄音頻,應用過濾器和連續播放聲音。 –

+0

@nininho我知道它會記錄聲音。那就是我在問題中提到的。我只想知道,只有當有一些沉默差距時,它纔會迴應。當它迴應時它一定感覺到了沉默。主要想法是,我只想知道如何感知無聲的差距,這樣我就可以在這些差距中解決一些意圖。 – Pargat

+0

那麼,你的聲音有一個特定的頻率範圍,稱爲語音頻帶。這個範圍從300赫茲到3400赫茲。您可以使用數字濾波器來偵聽該範圍內的某些內容。除此之外,我不太確定。 –

回答

1

好的,我已經知道了。我已經使用mediaRecorder這個類。當應用程序啓動時,我開始使用mediaRecoder錄製音頻(或者您可以提供一個按鈕來啓動和停止整個過程)。我檢查mediaRecorder記錄的音頻的幅度。如果幅度超過預定義的閾值,我暫停記錄並啓動Voice Recognition activity。在OnActivityResult我再次恢復錄音機。

if(mRecorder != null){ 
     int i= mRecorder.getMaxAmplitude(); // Getting amplitude 
     Log.d("AMPL : ", String.valueOf(i)); 

     if(i>20000){  // If amplitude is more than 20000 
      onRecord(false); //Stop recording before launching recognizer 
      Intent intent=new Intent(this,VoiceRecognizer.class); //Launch recognizer activity 
      startActivityForResult(intent, 12112); 
     } 

或者:您還可以使用RecognitionListener接口稱爲在this SO發佈。

2

大多數語音識別器已經有一個endpointer來檢測語音開始和結束語音。終點通常會嘗試讀取環境噪音水平以確定靜音的基線並調整信噪比。但是,如果輸入噪聲電平發生變化,可能會觸發endpointer的開始語音。如果一直在用敏感的麥克風聆聽,endpointer可能還會吸引旁邊的人說話,而不是你。

因此,使用語音按鈕是一種很好的做法,可以在您想要講話時發佈。試圖讓識別器一直聆聽可能不是你想要做的,或者應該留給研究人員。