2010-06-09 48 views
4

我正在研究需要對從麥克風捕獲的原始PCM音頻執行識別算法的應用程序。在我測試過的所有Android設備上,PCM數據都可用(即原始音頻數據)。新Sprint EVO並非如此。如何禁用HTC EVO(超音速)AGC?

Sprint EVO在麥克風上有AGC(自動增益控制),這會破壞數據,使我們的識別算法不再起作用。

我相信這是HTC爲此設備(也可能是未來的設備)添加到操作系統的功能。我已經在使用相同操作系統版本(2.1)的其他一些設備上測試了我們的應用程序,並且這些其他設備的行爲一般。

不幸的是,HTC尚未公佈在此設備上使用的代碼。我希望我可能不得不使用JNI來繞過這個特定設備,並且我願意這樣做,但是如果不能訪問HTC源代碼,我不知道從哪裏開始。

有沒有辦法扭轉AGC的影響,所以我堅持試圖解決它。

更具體的信息:

我使用AudioRecorder,以獲得訪問原始的PCM數據。我已經嘗試了一些使用MediaRecorder錄製AMR數據的程序,這些錄像也顯示相同的AGC屬性。

我還沒有嘗試的一件事是編寫自己的例程來使用MediaRecorder並使用setAudioSource(AudioSource.VOICE_RECOGNITION)。我可以在這個標誌上找到的唯一文檔來自Android參考文獻,它只是簡單地聲明「如果可用,則調整爲用於語音識別的麥克風音頻源,否則其行爲如同DEFAULT。」這可能是我需要的,但是需要額外的步驟來解碼AMR數據以獲得PCM數據(如果必須的話,我會這樣做)。

如果有人知道關於這個新功能的任何信息「,任何信息將不勝感激。具體來說,如果我有以下任何問題的答案,我的生活將會好得多:

  1. 這是HTC特有的新功能嗎?
  2. HTC何時會發布EVO/Supersonic的代碼庫?
  3. 是否有其他人遇到這種情況,並找到解決此問題的方法?
  4. AudioSource.VOICE_RECOGNITION確實可以防止AGC?
  5. AudioSource.VOICE_RECOGNITION的存在是否表明這在未來的設備中預計會更常見,並且該標誌是繞過它的規定?

任何其他線索,提示,提示將不勝感激。

回答

6

事實證明,我找到了解決辦法,同時瀏覽了Android的Git倉庫:

AudioRecord ar = 
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...); 

對於運行OS 2.1及以上的設備,這可以讓你收到不受AGC和音頻流仍然是一個高質量的16位PCM數據流。

我將我的應用程序定位在1.5及以上,並且在API級別7(OS 2.1)之前不支持此VOICE_RECOGNITION標誌。但是,由於EVO運行v2。1,並且我相對確信這對OS 2.1之前的任何設備都不會造成問題,但簡單的版本檢查將有助於將解決方案僅限於那些需要/支持它的設備。

0

不幸的是,

AudioRecord ar = 
    new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, ...); 

不是一個通用的解決方案。即使選擇了MediaRecorder.AudioSource.VOICE_RECOGNITION,一些製造商也會應用AGC。他們完全忽略了Google的「兼容性定義」。見How avoid automatic gain control with AudioRecord?