当前位置:首页 » 安卓系统 » 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 浏览:748
没有权限访问计算机 发布:2025-07-05 13:29:11 浏览:423
javaweb开发教程视频教程 发布:2025-07-05 13:24:41 浏览:682
康师傅控流脚本破解 发布:2025-07-05 13:17:27 浏览:231
java的开发流程 发布:2025-07-05 12:45:11 浏览:676
怎么看内存卡配置 发布:2025-07-05 12:29:19 浏览:275
访问学者英文个人简历 发布:2025-07-05 12:29:17 浏览:825