當前位置:首頁 » 安卓系統 » android實現語音

android實現語音

發布時間: 2023-04-21 13:19:23

A. (三)Android區域網內語音對講 基於UDP語音傳輸

之前研究了基於UDP的文字傳輸 點擊打開鏈接 ,以及Android端的語音錄制 點擊打開鏈接 ,這篇文章就記錄一下Android端局凱羨伏域網內的語音傳輸,簡單的實現語音對講,當然裡面還存在派旦著很多問題,包括語音不清晰啊、雜音多啊,不管了,先聽見聲音就行了。測試的時候兩部手機,上圖:盯攜

程序寫了兩個線程,一個用於錄制AudioRecordThread,一個用於播放AudioTrackThread.

(一)錄制與發送

@Override

public void run() {

if (mSocket == null)

return;

try {

mStartTime = System.currentTimeMillis();

audioRec.startRecording();

while (flag) {

try {

byte[] bytes_pkg = buffer.clone();

if (mRecordQueue.size() >= 2) {

int length = audioRec.read(buffer, 0, minBufferSize);

//獲取音量大小

mVolume = getAudioColum(buffer);

System.out.println(TAG + "= " + mVolume);

Message message = mHandler.obtainMessage();

message.arg1 = (int) mVolume;

mHandler.sendMessage(message);

DatagramPacket writePacket;

InetAddress inet = InetAddress.getByName(inetAddressName);

writePacket = new DatagramPacket(buffer, length, inet, PORT);

writePacket.setLength(length);

System.out.println("AudioRTwritePacket = " + writePacket.getData().toString());

mSocket.send(writePacket);

}

mRecordQueue.add(bytes_pkg);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

audioRec.stop();

} catch (Exception e) {

e.printStackTrace();

}

}

裡麵包含了獲取音量大小,便於在頁面上面展示,方法參考了 點擊打開鏈接

private double getAudioColum(byte[] buffer) {

double sumVolume = 0.0;

double avgVolume = 0.0;

double volume = 0.0;

for (int i = 0; i < buffer.length; i += 2) {

int v1 = buffer[i] & 0xFF;

int v2 = buffer[i + 1] & 0xFF;

int temp = v1 + (v2 << 8);// 小端

if (temp >= 0x8000) {

temp = 0xffff - temp;

}

sumVolume += Math.abs(temp);

}

avgVolume = sumVolume / buffer.length / 2;

volume = Math.log10(1 + avgVolume) * 10;

return volume;

}

(二)接收與播放

@Override

public void run() {

if (mSocket == null)

return;

//從文件流讀數據

audioTrk.play();

while (flag) {

DatagramPacket recevPacket;

try {

recevPacket = new DatagramPacket(buffer, 0, buffer.length);

mSocket.receive(recevPacket);

audioTrk.write(recevPacket.getData(), 0, recevPacket.getLength());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

audioTrk.stop();

}

(三)主頁面 接收按鈕事件

@OnClick({R.id.btn_receive})

public void onViewClicked(View view) {

switch (view.getId()) {

case R.id.btn_receive:

if (btnReceive.getText().toString().equals("開始接收")) {

btnReceive.setText("停止接收");

try {

if (audioTrackThread == null) {

audioTrackThread = new AudioTrackThread();

}

new Thread(audioTrackThread).start();

} catch (SocketException e) {

e.printStackTrace();

}

} else {

btnReceive.setText("開始接收");

audioTrackThread.setFlag(false);

}

break;

}

}

(四)發送按鈕事件

ivSpeak.setOnTouchListener(new View.OnTouchListener() {

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

//按下按鈕開始錄制

ivSpeak.setText("正在說話");

//顯示錄音提示

relativeLayout.setVisibility(View.VISIBLE);

try {

if (audioRecordThread == null) {

audioRecordThread = new AudioRecordThread(handler);

}

audioRecordThread.setInetAddressName(tvReceiveIp.getText().toString());

audioRecordThread.setFlag(true);

new Thread(audioRecordThread).start();

} catch (SocketException e) {

e.printStackTrace();

}

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

//松開按鈕結束錄制

ivSpeak.setText("按住說話");

relativeLayout.setVisibility(View.GONE);

audioRecordThread.setFlag(false);

mStopTime = audioRecordThread.getmStopTime();

mStartTime = audioRecordThread.getmStartTime();

creatMessageBean((mStopTime - mStartTime) / 1000, true);

break;

}

return true;

}

});

B. 如何進行語音識別 android開發

語音識別
2008年Google語音搜索在iphone平台上線,Android 1.5 將語音識別應用到搜索功能上。
手動輸入是目前主薯數李要與手機互動的方式,語音搜索宗旨是最大限度數遲地改善人機交互的便捷性。
在玩游戲時,通過語音來控制操作,更顯得人性化,體驗更佳。
Android 中主要通過RecognizerIntent來實現語音識別。
RecognizerIntent包括的常量
ACTION_RECOGNIZE_SPEECH
ACTION_WEB_SEARCH
EXTRA_LANGUAGE
EXTRA_LANGUAGE_MODEL
EXTRA_MAX_RESULTS
EXTRA_PROMPT
EXTRA_RESULTS
LANGUAGE_MODEL_FREE_FORM
LANGUAGE_MODEL_WEB_SEARCH
RESULT_AUDIO_ERROR
RESULT_CLIENT_ERROR
RESULT_NETWORK_ERROR
RESULT_NO_MATCH
RESULT_SERVER_ERROR
// 打開語音識別
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 「開始語音");
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
在模擬器上找不到語音設備,會拋出異常ActivityNotFoundException。
示例:
點畢罩擊「開始使用語音識別」按鈕後,開始語音輸入,然後在onActivityResult方法中取得結果並顯示出來
protect void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
ArrayList<String> results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
StringBuffer sb = new StringBuffer();
for(int i=0; i<results.size; i++) {
sb.append(results.get(i));
}
Toast.makeText(this, sb.toString(), Toast.LENGTH_LONG).show();
super.onActivityResult(requestCode, resultCode, data);
}

C. android手機如何實現語音控制

語音控制並不是靠單純的聲音採集觸發,而是採集聲音後將聲音轉碼為文字,靠文字來觸發這些功能。向單片機發送的最終數據是文字,通過文字觸發功能,而並不是用語音文件觸發功能。您明白了嗎?

D. android上如何實時語音聊天

android開放實現語音通話最快的方式直接用現成SDK,可以試試ZEGO即構科技的實時語音SDK,實現流程也比較便捷,通過四行代碼,三十分鍾就可以搭建聊天場景了

E. 如何用pocketsphinx實現android離線語音識別

1.搭建Android開發環境和NDK配置就不說了,網上教程很多。
2.下載sphinxbase – snapshot,pocketsphinx – snapshot和PocketsphinxAndroidDemo – snapshot,然後吧sphinxbase和pocketsphinx放到同一個文件夾下,用./autogen.sh &&./configure && make && make install的方法先安裝sphinxbase,再安裝pocketsphinx。
3.把PocketSphinxDemo導入Eclipse,進入PocketSphinxDemo/jni文件夾,把Android.mk里的SPHINX_PATH變數改成sphinxbase和pocketsphinx的父目錄。
4.在jni文件夾運行ndk-build命令。(當然,需要先配置好ndk)
5.在Eclipse里,PocketSphinxDemo項目的Properties中,選擇Builders,可以看到SWIG和NDK,NDK的build其實可以通過4中的命令來完成,也可以通過eclipse自動完成。
選擇NDK,點擊Edit按鈕,出現的框中,在Location區域選擇ndk文件夾,然後點擊Refresh選項卡,選擇「The project containing the selected resource」,點擊Build Options選項卡,取消選擇「Specify working set of relevant resources」。
選擇SWIG,點擊Edit,在Refresh選項卡中選擇 「The folder containing the selected resource」,在Build Options選項卡中取消選擇「Specifiy working set of relevant resources」。
6.把手機和電腦連接,把pocketsphinx/model/hmm/en_US里的hub4wsj_sc_8k,hmm/en_US,lm/en_US放入手機的某個文件夾,如用adb push把使手機存在如下文件或文件夾:

/sdcard/Android/data/e.cmu.pocketsphinx/hmm/en_US/hub4wsj_sc_8k
/sdcard/Android/data/e.cmu.pocketsphinx/lm/en_US/hub4.5000.dic
/sdcard/Android/data/e.cmu.pocketsphinx/lm/en_US/hub4.5000.DMP

7.在PocketSphinxDemo項目中使 RecognizerTask.java里c.setString函數中的參數符合6中存放的文件和文件夾。
8.構建運行

F. android 怎麼實現語音聊天

可以用第三方即時通訊雲服務商,也可以自己開發實現。看你公司的能力和需求。自己開發耗時耗人耗精力。用第三方,比如融雲,這里就舉個融雲的例子吧。 可以直接集成融雲的sdk,然後直接實現你說的功能。優點是快速方便,服務穩定。缺點是:不是自己開發的,如果出現問題需要提工單解決。

G. 如何調用android的文字轉語音

雖然視覺上的反饋通常是給用戶提供信息最快的方式,但這要求用戶把注意力設備上。當用戶不能查看設備時,則需要一些其他通信的方法。Android提供了強大的文字轉語音Text-to-Speech,TTS API。使開發者能夠在應用中添加語音通知和其他語音反饋功能,而不要求用戶看著屏幕。
下面的代碼展示了如何使用TTS API:

public class TextToSpeechDemo implements TextToSpeech.OnInitListener {
private final TextToSpeech mTextToSpeech;//TTS對象
private final ConcurrentLinkedQueue mBufferedMessages;//消息隊列
private Context mContext;
private boolean mIsReady;//標識符

public TextToSpeechDemo(Context context){
this.mContext=context;//獲取上下文
this.mBufferedMessages=new ConcurrentLinkedQueue();//實例化隊列
this.mTextToSpeech=new TextToSpeech(this.mContext,this);//實例化TTS
}

//初始化TTS引擎
@Override
public void onInit(int status) {
Log.i("TextToSpeechDemo",String.valueOf(status));
if(status==TextToSpeech.SUCCESS){
int result = this.mTextToSpeech.setLanguage(Locale.CHINA);//設置識別語音為中文
synchronized (this){
this.mIsReady=true;//設置標識符為true
for(String bufferedMessage : this.mBufferedMessages){
speakText(bufferedMessage);//讀語音
}
this.mBufferedMessages.clear();//讀完後清空隊列
}
}
}
//釋放資源
public void release(){
synchronized (this){
this.mTextToSpeech.shutdown();
this.mIsReady=false;
}
}

//更新消息隊列,或者讀語音
public void notifyNewMessage(String lanaugh){
String message=lanaugh;
synchronized (this){
if(this.mIsReady){
speakText(message);
}else{
this.mBufferedMessages.add(message);
}
}
}

//讀語音處理
private void speakText(String message){
Log.i("liyuanjinglyj",message);
HashMap params=new HashMap();
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM,"STREAM_NOTIFICATION");//設置播放類型(音頻流類型)
this.mTextToSpeech.speak(message, TextToSpeech.QUEUE_ADD, params);//將這個發音任務添加當前任務之後
this.mTextToSpeech.playSilence(100,TextToSpeech.QUEUE_ADD,params);//間隔多長時間
}
}

當然一般手機是不支持中文的可以網路下載訊飛TTS引擎後在測試。
由於TTS引擎的初始化是非同步的,所以在執行實際的文字轉語音之前需要把消息放到隊列中。

可以給TTS引擎發送多個參數。前面展示了如何決定口語消息使用的音頻流。在這種情況下,通知聲音也使用相同的音頻流。

最後,如果處理連續多個消息,最好在每個消息結束後暫停一會在播放下一個消息。這樣做會清楚的告訴用戶消息的結束和開始。

H. android語音聊天軟體怎麼實現

看你要實時傳輸的還是非實時的. 開頭的過程都是捕捉音頻然後編碼.編碼也可以說是語音壓縮,壓縮演算法有n種.gsm,g711,g723,g729,g722,silk,ilbc ====, 實時傳輸可以使用RTP協議.有開源的rtp協議實現庫. 在android平台上比較快速可以實現的有PJMEDIA.有java ports.

I. (四)Android基於UDP的多客戶端語音通信

在前三篇得基礎上,這次研究了組播功能。非常感謝https://blog.csdn.net/jspping/article/details/64438515得貢獻!

組播也就是通過MulticastSocket來進行開發,與DatagramSocket比較相類似,這次依然是用兩個線程進行實現,發送線程MultiSendThread和接收線程MultiReceiveThread。廢話不多說,開始碼:

(一)MultiSendThread:

(1)初始化MuticastSocket

// 偵聽的埠

try {

    multicastSocket = new MulticastSocket(8082);

    //段悔 使用D類地址,該地址為發起組播的那個ip段,即偵聽10001的套接字

    address = InetAddress.getByName("239.0.0.1");

} catch (IOException e) {

    e.printStackTrace();

}

(2)初始化AudioRecord

protected LinkedList<byte[]> mRecordQueue;

int minBufferSize;

private static AcousticEchoCanceler aec;

private static AutomaticGainControl agc;

private static NoiseSuppressor nc;

AudioRecord audioRec;

byte[] buffer;

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)

private void initAudio() {

    //播放的采樣頻率 和錄制的采樣頻率一樣

    int sampleRate = 44100;

    //和錄制的一樣的

    int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

    //錄音用輸入改昌單聲道  播放用輸出單聲道

    int channelConfig = AudioFormat.CHANNEL_IN_MONO;

    minBufferSize = AudioRecord.getMinBufferSize(

            sampleRate,

            channelConfig, AudioFormat.ENCODING_PCM_16BIT);

    System.out.println("****RecordMinBufferSize = " + minBufferSize);

    audioRec = new AudioRecord(

            MediaRecorder.AudioSource.MIC,

            sampleRate,

            channelConfig,

            audioFormat,

           握殲正 minBufferSize);

    buffer = new byte[minBufferSize];

    if (audioRec == null) {

        return;

    }

    //聲學回聲消除器 AcousticEchoCanceler 消除了從遠程捕捉到音頻信號上的信號的作用

    if (AcousticEchoCanceler.isAvailable()) {

        aec = AcousticEchoCanceler.create(audioRec.getAudioSessionId());

        if (aec != null) {

            aec.setEnabled(true);

        }

    }

    //自動增益控制 AutomaticGainControl 自動恢復正常捕獲的信號輸出

    if (AutomaticGainControl.isAvailable()) {

        agc = AutomaticGainControl.create(audioRec.getAudioSessionId());

        if (agc != null) {

            agc.setEnabled(true);

        }

    }

    //雜訊抑制器 NoiseSuppressor 可以消除被捕獲信號的背景噪音

    if (NoiseSuppressor.isAvailable()) {

        nc = NoiseSuppressor.create(audioRec.getAudioSessionId());

        if (nc != null) {

            nc.setEnabled(true);

        }

    }

    mRecordQueue = new LinkedList<byte[]>();

}

(3)開始錄制,並實時發送出去

@Override

public void run() {

    if (multicastSocket == null)

        return;

    try {

        audioRec.startRecording();

        while (true) {

            try {

                byte[] bytes_pkg = buffer.clone();

                if (mRecordQueue.size() >= 2) {

                    int length = audioRec.read(buffer, 0, minBufferSize);

                    // 組報

                    DatagramPacket datagramPacket = new DatagramPacket(buffer, length);

                    // 向組播ID,即接收group /239.0.0.1  埠 10001

                    datagramPacket.setAddress(address);

                    // 發送的埠號

                    datagramPacket.setPort(10001);

                    System.out.println("AudioRTwritePacket = " + datagramPacket.getData().toString());

                    multicastSocket.send(datagramPacket);

                }

                mRecordQueue.add(bytes_pkg);

            } catch (Exception e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

}

(二)MultiReceiveThread

(1)初始化MulticastSocket

// 接收數據時需要指定監聽的埠號

try {

    multicastSocket = new MulticastSocket(10001);

    // 創建組播ID地址

    InetAddress address = InetAddress.getByName("239.0.0.1");

    // 加入地址

    multicastSocket.joinGroup(address);

} catch (IOException e) {

    e.printStackTrace();

}

(2)初始化AudioTrack

byte[] buffer;

AudioTrack audioTrk;

private void initAudioTracker() {

    //揚聲器播放

    int streamType = AudioManager.STREAM_MUSIC;

    //播放的采樣頻率 和錄制的采樣頻率一樣

    int sampleRate = 44100;

    //和錄制的一樣的

    int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

    //流模式

    int mode = AudioTrack.MODE_STREAM;

    //錄音用輸入單聲道  播放用輸出單聲道

    int channelConfig = AudioFormat.CHANNEL_OUT_MONO;

    int recBufSize = AudioTrack.getMinBufferSize(

            sampleRate,

            channelConfig,

            audioFormat);

    System.out.println("****playRecBufSize = " + recBufSize);

    audioTrk = new AudioTrack(

            streamType,

            sampleRate,

            channelConfig,

            audioFormat,

            recBufSize,

            mode);

    audioTrk.setStereoVolume(AudioTrack.getMaxVolume(),

            AudioTrack.getMaxVolume());

    buffer = new byte[recBufSize];

}

(3)開始接收,並進行實時播放

@Override

public void run() {

    if (multicastSocket == null)

        return;

    //從文件流讀數據

    audioTrk.play();

    // 包長

    while (true) {

        try {

            // 數據報

            DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);

            // 接收數據,同樣會進入阻塞狀態

            multicastSocket.receive(datagramPacket);

          audioTrk.write(datagramPacket.getData(), 0, datagramPacket.getLength());

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

}

(三)開始測試

MultiSendThread multiSendThread;

MultiReceiverThread multiReceiverThread;

@OnClick({R.id.btnSend, R.id.btnReceive})

public void onViewClicked(View view) {

    switch (view.getId()) {

        case R.id.btnSend:

            if (multiSendThread == null) {

                multiSendThread = new MultiSendThread();

            }

            new Thread(multiSendThread).start();

            break;

        case R.id.btnReceive:

            if (multiReceiverThread == null) {

                multiReceiverThread = new MultiReceiverThread();

            }

            new Thread(multiReceiverThread).start();

            break;

    }

}

J. android怎樣實現中文語音朗讀

官方現在支持中文,下載eSpeak這個語音包,google code就能搜索到。eSpeak支持60種語言,包括中文。不過中文很難聽就是。
國內也有一些語音包支持中文朗讀,比如手說tts。

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:515
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:19
linux485 發布:2025-07-05 14:38:28 瀏覽:299
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:750
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:425
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:686
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:233
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:678
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:277
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:828