很多網友對會說話的TOM貓的原理比較感興趣,這里Android123就實現做一個簡單的分析:
1. 音頻采集
這點主要是通過Android設備的麥克風實時采集音頻,由於Android平台的MediaRecorder類錄制音頻到文件,雖然可以通過空設備回調獲得實時的音頻流,不過為了降低開發者的難度,Android開發網推薦使用正統的AudioRecord和AudioTrack,首先我們仍然需要加入android.permission.RECORD_AUDIO這個權限。
android.media.AudioRecord類的read方法主要有3種重載形式:
int read(short[] audioData, int offsetInShorts, int sizeInShorts) //short在java中占用兩個字節
int read(byte[] audioData, int offsetInBytes, int sizeInBytes) //byte在java中占用一個字節
int read(ByteBuffer audioBuffer, int sizeInBytes) //基於NIO的ByteBuffer類型
我們可以看到從麥克風中獲取的音頻無需經過文件系統直接通過AudioRecord類的read方法讀入到我們預定的緩沖區中,這里需要注意的是采樣率的大小必須有足夠的緩沖區空間處理、
2. 變聲處理
這點需要一些基本的音頻處理方式,比如移調、變速,Android開發網推薦大家參考Adobe Audition的早期Cool Editi泄露的代碼,當然音頻處理算法比較多,大家可以自己實現。
3. 播放原始音頻流
同樣,處理完后考慮到效率我們仍然直接從內存流中播放,最簡單的就是AudioTrack類,通過android.media.AudioTrack類的write方法,讓Android聲卡播放原始音頻流。兩種重載方法如下
int write(short[] audioData, int offsetInShorts, int sizeInShorts)
int write(byte[] audioData, int offsetInBytes, int sizeInBytes)