android即時語音
1. android 區域網實時語音聊天音頻流用什麼編
一般如果應用需要進行大量數學運算時,推薦使用JNI在java中調用C/C++編寫的動態庫,Java只負責邏輯和界面用戶操作的相應,
你這個APP很簡單分為以下幾個模塊
界面,與用戶進行交互,需要具備Android界面的編程;
網路傳輸,需要掌握Java網路socket編程的知識,使用TCP傳輸編碼後的音頻幀;
語音編解碼模塊,由兩部分構成。一是c/c++編寫的動態庫,二是Java聲明本地native函數,並將c/c++實現的native函數進行封裝,方便Java調用。這部分需要掌握Java中JNI使用的知識,c/c++編程,語音處理的方面的知識,例如數字信號處理。
而c/c++寫的庫一般不是我們自己實現的,而是引入第三方開源代碼,這里的選擇有很多,我了解到的有
ffmeg,很常用,就連暴風影音和QQ音樂據說用了他們的開源庫,而沒有遵守開源協議而進入了他們的黑名單。
speex,是國外的開源庫,現已被Opus取代,但是speex多了一個預處理功能,例如降噪、自動增益、迴音消除等等。
Superpowered,跨平台的,低延遲,功能多。
補充一點,Android現已支持純C++的開發了,這個就需要NDK的配合,寫出NativeActivity,然後就可以直接在C++中調用第三方的庫了,而不用JNI這樣繁瑣,但是由於剛出來,教程不多,需要具備很多嵌入式、音視頻採集處理的開發經驗。
2. android 怎麼實現語音聊天
可以用第三方即時通訊雲服務商,也可以自己開發實現。看你公司的能力和需求。自己開發耗時耗人耗精力。用第三方,比如融雲,這里就舉個融雲的例子吧。 可以直接集成融雲的sdk,然後直接實現你說的功能。優點是快速方便,服務穩定。缺點是:不是自己開發的,如果出現問題需要提工單解決。
3. 安卓有比較好的語音助手就像siri一樣的嗎
安卓有語音助手,以OPPO手機為例,語音助手的使用方法如下:
一、打開手機,在桌面上找到「設置」一項,點擊進入。
4. 安卓手機能語音讀簡訊的軟體 要那種可以隨時都能讀的
簡訊聽聽
簡訊聽聽是一款免費的
安卓手機
簡訊語音朗讀軟體,安裝上它以後再也不用看簡訊讀簡訊了,收到簡訊後一點,就會用語音播放出來。
5. android上如何實時語音聊天
android開放實現語音通話最快的方式直接用現成SDK,可以試試ZEGO即構科技的實時語音SDK,實現流程也比較便捷,通過四行代碼,三十分鍾就可以搭建聊天場景了
6. android實現語音聊天功能難不難
如果是打算自己從零開始研發,那難不難得看自己團隊的技術水平,覺得有難度的話,不如試一試和第三方開發商合作,諸如有20年經驗的ZEGO即構科技團隊,他們自主研發了實時語音SDK,實現語音聊天功能很簡單的,直接接入SDK就可以了。
7. 安卓 能用mediarecorder和mediaplayer實現即時語音嗎
android語音錄制可以通過MediaRecorder和AudioRecorder。
MediaRecorder本來是多媒體錄制控制項,可以同時錄制視頻和語音,當不指定視頻源時就只錄制語音;AudioRecorder只能錄制語音。
二者錄制的區別在於,MediaRecorder固定了語音的編碼格式,具體平台支持類型可以在http://developer.android.com/guide/appendix/media-formats.html這里查看,而且使用時指定輸出文件,在錄制的同時系統將語音數據寫入文件。AudioRecorder輸出的是pcm,即原始音頻數據,使用者需要自己讀取這些數據,這樣的好處是可以根據需要邊錄制邊對音頻數據處理,讀取的同時也可以保存到文件進行存儲。
語音的播放可以使用MediaPlayer和AudioTracker,與上面的對應,MediaPlayer可以播放各種多媒體文件,而AudioTracker只能播放pcm數據,使用者手動將數據連續寫入進行播放。
MediaRecorder的使用
[java] view plain print?
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mRecorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
mRecorder.start();
}
AudioRecorder錄制語音
[java] view plain print?
int suggestBufferSize = AudioRecord.getMinBufferSize(mSampleRate,
mChannelConfig, mAudioFormat);
mAudioRecord = new AudioRecord(AudioSource.MIC, mSampleRate,
mChannelConfig, mAudioFormat, suggestBufferSize);
mAudioRecorder.startRecording();
byte[] inByteBuf = new byte[BUF_SIZE]
while (runFlag) {
int readSize = mAudioRecord.read(inByteBuf, 0, inByteBuf.length);
}
mAudioRecorder.stop();
mAudioRecord.release();
上面是AudioRecorder的完整使用過程,AudioRecorder實例化的時候需要指定錄音源、采樣率等音頻參數,最後一個是音頻數據緩沖區大小,需要通過AudioRecord.getMinBufferSize()來得到緩沖區的最小值,如果實例化時參數小於這個最小值,那麼AudioRecoder將創建失敗。當然大於這個值肯定可以。之後通過read將緩沖區的數據讀出來。
之前一直以為讀取時使用的byte數組大小必須和緩沖區的大小一致,但實際並不是這樣,看下AudioRecorder構造函數中對bufferSizeInBytes的解釋:
bufferSizeInBytes the total size (in bytes) of the buffer where audio data is written to ring the recording. New audio data can be read from this buffer in smaller chunks than this size.
也就是說緩沖區只是系統用來臨時存放音頻數據的,讀取時可以每次讀取較小的塊,然後多次讀取。
AudioRecorder還有一個方法setPositionNotificationPeriod (int periodInFrames)。這個方法可以在讀取指定數據後發出一個回調,需要配合 (AudioRecord. listener),當讀取的總數據是指定的periodInFrames的整數倍時就會調用listner的方法onPeriodicNotification.
[java] view plain print?
new () {
@Override
public void onPeriodicNotification(AudioRecord recorder) {
// TODO Auto-generated method stub
}
@Override
public void onMarkerReached(AudioRecord recorder) {
// TODO Auto-generated method stub
}
};
這個特性使用時有個注意點,就是回調只會發生在實際數據讀取之後,也就是使用者通過read方法讀取出periodInFrames這么多數據時才會觸發這個回調,否則什麼也不會發生。
MeidaPlayer播放音頻文件
[java] view plain print?
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer.stop();
mediaPlayer.release();
其中setDataSource()有多個覆寫,如下
void setDataSource(String path)
Sets the data source (file-path or http/rtsp URL) to use.
void setDataSource(Context context, Uri uri, Map<String, String> headers)
Sets the data source as a content Uri.
void setDataSource(Context context, Uri uri)
Sets the data source as a content Uri.
void setDataSource(FileDescriptor fd, long offset, long length)
Sets the data source (FileDescriptor) to use.
void setDataSource(FileDescriptor fd)
Sets the data source (FileDescriptor) to use.
可以看到不同的輸入參數指定了數據的來源。其中setDataSource(FileDescriptor fd, long offset, long length)可以指定開始讀取的偏移量和長度。
之所以會注意到這個參數是因為在實際使用時有一個需求,即可以播放WAV文件,又可以播放MP3文件,而且能夠限定播放開始和結束的位置。
對於MP3文件使用setDataSource(FileDescriptor fd, long offset, long length)是完全可行的,像這樣
[java] view plain print?
mPlayer.reset();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(
new FileInputStream(mSoundFile.getFilePath()).getFD(),
startByte, endByte - startByte);
[java] view plain print?
mPlayer.prepare();
但WAV文件卻完全沒有效果,是什麼原因呢,看下官方對setDataSource(FileDescriptor fd, long offset, long length)的解釋
Sets the data source (FileDescriptor) to use. The FileDescriptor must be seekable (N.B. a LocalSocket is not seekable). It is the caller's responsibility to close the file descriptor. It is safe to do so as soon as this call returns.
注意到該方法指定的文件類型必須是seekable的,mp3文件屬於這種類型(tips:不知道還有沒有其他類型),因為mp3內部是按幀存儲的,可以指定到具體的幀位置,而WAV文件音頻數據是pcm,也就是一大片完整的數據,要對wav文件指定開始播放位置,需要使用另一個方法seekTo (int msec)。這里指定的參數是毫秒。
開始時間可以指定了,那結束播放的時間如何指定?
MediaPlayer有另外兩個方法:getDuration ()和getCurrentPosition (),這兩個返回的都是時間信息,前者返回總的播放時間,後者返回當前播放位置的時間。
那返回的結果對於mp3和wav是否會不同呢?會!
對WAV類型,getDuration返回的是音頻文件的總時間,getCurrentPosition返回的是從文件起始到現在的播放時間;而對mp3類型,getDuration返回的是startByte和endByte之間播放的時間間隔,getCurrentPosition返回從startByte到現在的播放時間。想一下原因也可以明白,因為MP3是可以精確指定起始位置的,所以所有計算都可以從指定的位置開始,而wav文件一切只能從最開始的位置計算。
8. 有沒有不用點它只要一說話就能出來的安卓手機語音助手
目前還沒有。
因為要考慮待機的時候用電量的問題,另外語音助手如果一直在線,那麼周圍的環境聲都會被語襲音助手識別,這樣會導致在不知道的情百況下語音助手被打開,可能會導致誤操作,所以語音助手沒度有設置為後台自動運行而是需要人工激活。
(8)android即時語音擴展閱讀:
1、YIYA語音
YIYA語音是騰訊在語音領域的一項拓展功能,融合了語音搜索、語音聊天、電話簡訊以及內部應用調用功能,相比其他語音助手YIYA語音人性化功能凸顯。
例如可以讓YIYA查油價、股價、美國時間、區號甚至一道菜的做法等版,當然如果你的問題它回答不了,是可以用語音告訴它正確答案的。
除了生活化定位,YIYA還能解放雙手。比如:用語音說「發簡訊給XX」,簡訊輸入界面即可調出,權簡訊內容和發送命令都可以通過語音完成,解除了用戶的文字輸入煩惱。
2、Cortana
中文名:微軟小娜。
微軟發布的全球第一款個人智能助理。它「能夠了解用戶的喜好和習慣」,「幫助用戶進行日程安排、問題回答等」。Cortana 可以說是微軟在機器學習和人工智慧領域方面的嘗試。
微軟想實現的事情是,手機用戶與小娜的智能交互,不是簡單地基於存儲式的問答,而是對話。
它會記錄用戶的行為和使用習慣,利用雲計算、搜索引擎和「非結構化數據」分析,讀取和「學習」包括手機中的文本文件、電子郵件、圖片、視頻等數據,來理解用戶 的語義和語境,從而實現人機交互。
假如手機中記錄的日程顯示將要參加會議,那麼不需任何操作,Cortana 到時就會自動將手機調至會議狀態。這也是微軟的研究,從個人計算機(personal computer)走向個人計算(personal computing)的開始。
3、靈犀語音助手
靈犀語音助手(Lingxi Voice Asisstant),一款普通話綜合識別率最高的智能語音軟體,是國內市場佔有率第一的中文語音助手。
由中文語音領導者科大訊飛和中國移動聯合推出,採用全球最先進語音識別技術且擁有豐富本土化服務,識別准確,喚醒迅速,特別針對中文口音問題進行識別優化。
靈犀支持全程用語音操控手機,用戶在與手機交談中即可完成打電話、發簡訊、設提醒、查地圖、找美食等日常操作,動口不動手,輕松享受智能生活。
9. 有什麼能進行即時語音對講的安卓手機軟體、免費的
來電。「來電
」是深圳市騰訊計算機系統有限公司出品的一個純粹語音溝通的網路電話應用。以語音為基礎,解決在各種移動場景下,用戶快速高效溝通和社交的需求。可以通過「來電」, 直接撥打「手機號、座機號、QQ號」及所有通訊錄好友。
註:」來電「需要wifi或者流量才能使用。
10. android 實現實時語音功能選擇接入哪個音視頻sdk好
可以考慮接入即構科技的音視頻sdk,他們的音視頻sdk平台兼容性強,可覆蓋 iOS、Android、Windows、macOS、Web、小程序並支持平台間互通,支持 32 路實時音視頻互動,能夠為開發者提供便捷接入、高清流暢、低延遲、高並發的音視頻服務,而且4 行代碼極速接入, 30 分鍾內即可構建完畢。