Android导航语音识别——读后听写语音识别(嵌入式)

article/2025/11/8 16:12:57

嵌入式项目之Android语音识别——读后听写语音识别(语音识别功能主函数调用)


文章目录

  • 前言
  • 一、代码示例
  • 二、代码分析
    • 1.创建 SpeechSynthesizer 对象
    • 2.设置合成参数
    • 3.开始合成
    • 4.设置合成状态监听器
    • 5.五个speakText类函数的作用
  • 总结


前言

最近在学习嵌入式系统的一个功能——导航语音识别,该功能是基于Android和科大讯飞语音识别语音合成,利用RFID射频识别技术实现的功能,整个导航语音识别功能包括语音识别、语音合成、导航听写、语音提示语音识别的语音合成三大模块。这里我整理了第三模块——读后听写语音识别。该模块是对前面两个模块的调用,也就是导航语音识别功能主函数调用。


一、代码示例

//读完听写的语音合成
private void speakText(String textBeSpeak) {SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID+ "=" + APPID);//1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListenerSpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类//设置发音人(更多在线发音人,用户可参见)mTts.setParameter(SpeechConstant. VOICE_NAME, "xiaoyan" ); // 设置发音人mTts.setParameter(SpeechConstant. SPEED, "20" );// 设置语速mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码//mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );//3.开始合成mTts.startSpeaking( textBeSpeak, new MySynthesizerListener()) ;
}
class MySynthesizerListener implements SynthesizerListener {@Overridepublic void onSpeakBegin() {// Log.d(TAG," 开始播放 ");}@Overridepublic void onSpeakPaused() {// showTip(" 暂停播放 ");}@Overridepublic void onSpeakResumed() {// showTip(" 继续播放 ");}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos ,String info) {// 合成进度}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError error) {if (error == null) {Speech();} else if (error != null ) {// showTip(error.getPlainDescription( true));}}@Overridepublic void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {}
}private void speakText1(String textBeSpeak) {SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID+ "=" + APPID);//1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListenerSpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类//设置发音人(更多在线发音人,用户可参见)mTts.setParameter(SpeechConstant. VOICE_NAME, "xiaoyan" ); // 设置发音人mTts.setParameter(SpeechConstant. SPEED, "20" );// 设置语速mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码//mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );//3.开始合成mTts.startSpeaking( textBeSpeak, new MySynthesizerListener1()) ;
}
class MySynthesizerListener1 implements SynthesizerListener {@Overridepublic void onSpeakBegin() {// Log.d(TAG," 开始播放 ");}@Overridepublic void onSpeakPaused() {// showTip(" 暂停播放 ");}@Overridepublic void onSpeakResumed() {// showTip(" 继续播放 ");}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos ,String info) {// 合成进度}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError error) {if (error == null) {daoda = false;vitSpeech();}else if (error != null ) {// showTip(error.getPlainDescription( true));}}@Overridepublic void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {}
}private void speakText2(String textBeSpeak) {SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID+ "=" + APPID);//1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListenerSpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类//设置发音人(更多在线发音人,用户可参见)mTts.setParameter(SpeechConstant. VOICE_NAME, "xiaoyan" ); // 设置发音人mTts.setParameter(SpeechConstant. SPEED, "20" );// 设置语速mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码//mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );//3.开始合成mTts.startSpeaking( textBeSpeak, new MySynthesizerListener2()) ;
}
class MySynthesizerListener2 implements SynthesizerListener {@Overridepublic void onSpeakBegin() {// Log.d(TAG," 开始播放 ");}@Overridepublic void onSpeakPaused() {// showTip(" 暂停播放 ");}@Overridepublic void onSpeakResumed() {// showTip(" 继续播放 ");}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos ,String info) {// 合成进度}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError error) {if (error == null) {if(kaiqi){route();}else{route1();}}else if (error != null ) {}}@Overridepublic void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {}
}private void speakText4(String textBeSpeak) {SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID+ "=" + APPID);//1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListenerSpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类//设置发音人(更多在线发音人,用户可参见)mTts.setParameter(SpeechConstant. VOICE_NAME, "xiaoyan" ); // 设置发音人mTts.setParameter(SpeechConstant. SPEED, "20" );// 设置语速mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码//mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );//3.开始合成mTts.startSpeaking( textBeSpeak, new MySynthesizerListener4()) ;
}
class MySynthesizerListener4 implements SynthesizerListener {@Overridepublic void onSpeakBegin() {// Log.d(TAG," 开始播放 ");}@Overridepublic void onSpeakPaused() {// showTip(" 暂停播放 ");}@Overridepublic void onSpeakResumed() {// showTip(" 继续播放 ");}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos ,String info) {// 合成进度}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError error) {if (error == null) {Speech2();} else if (error != null ) {// showTip(error.getPlainDescription( true));}}@Overridepublic void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {}
}private void speakText3(String textBeSpeak) {SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID+ "=" + APPID);//1. 创建 SpeechSynthesizer 对象 , 第二个参数: 本地合成时传 InitListenerSpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类//设置发音人(更多在线发音人,用户可参见)mTts.setParameter(SpeechConstant. VOICE_NAME, "xiaoyan" ); // 设置发音人mTts.setParameter(SpeechConstant. SPEED, "20" );// 设置语速mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码//mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );//3.开始合成mTts.startSpeaking( textBeSpeak, new MySynthesizerListener2()) ;
}
class MySynthesizerListener3 implements SynthesizerListener {@Overridepublic void onSpeakBegin() {// Log.d(TAG," 开始播放 ");try {wait();} catch (InterruptedException e) {e.printStackTrace();}}@Overridepublic void onSpeakPaused() {// showTip(" 暂停播放 ");}@Overridepublic void onSpeakResumed() {// showTip(" 继续播放 ");}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos ,String info) {// 合成进度}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError error) {if (error == null) {notifyAll();}else if (error != null ) {}}@Overridepublic void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {}
}@Override
protected void onDestroy()
{super.onDestroy();//解除广播接收器unregisterReceiver(mGattUpdateReceiver);mBluetoothLeService = null;
}// Activity出来时候,绑定广播接收器,监听蓝牙连接服务传过来的事件
@Override
protected void onResume()
{super.onResume();//绑定广播接收器registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());if (mBluetoothLeService != null){//根据蓝牙地址,建立连接final boolean result = mBluetoothLeService.connect(mDeviceAddress);}
}/* 意图过滤器 */
private static IntentFilter makeGattUpdateIntentFilter()
{final IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);return intentFilter;
}
/* BluetoothLeService绑定的回调函数 */
private final ServiceConnection mServiceConnection = new ServiceConnection()
{@Overridepublic void onServiceConnected(ComponentName componentName,IBinder service){mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();if (!mBluetoothLeService.initialize()){//Log.e(TAG, "Unable to initialize Bluetooth");finish();}mBluetoothLeService.connect(mDeviceAddress);}@Overridepublic void onServiceDisconnected(ComponentName componentName){mBluetoothLeService = null;}
};/*** 广播接收器,负责接收BluetoothLeService类发送的数据*/
private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver()
{@Overridepublic void onReceive(Context context, Intent intent){final String action = intent.getAction();if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action))//Gatt连接成功{mConnected = true;//status = "connected";//更新连接状态//updateConnectionState(status);System.out.println("BroadcastReceiver :" + "device connected");} else if (BluetoothLeService.ACTION_GATT_DISCONNECTED//Gatt连接失败.equals(action)){mConnected = false;//status = "disconnected";//更新连接状态//updateConnectionState(status);System.out.println("BroadcastReceiver :"+ "device disconnected");} else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED//发现GATT服务器.equals(action)){// Show all the supported services and characteristics on the// user interface.//获取设备的所有蓝牙服务displayGattServices(mBluetoothLeService.getSupportedGattServices());System.out.println("BroadcastReceiver :"+ "device SERVICES_DISCOVERED");} else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action))//有效数据{//处理发送过来的数据try {if (intent.getExtras().getString(BluetoothLeService.EXTRA_DATA)!=null) {displayData(intent.getExtras().getString(BluetoothLeService.EXTRA_DATA), intent);System.out.println("BroadcastReceiver onData:"+ intent.getStringExtra(BluetoothLeService.EXTRA_DATA));}}catch (Exception e){e.printStackTrace();}}}
};

 语音合成:

依据科大讯飞的语音在线合成技术得以实现。在科大讯飞服务器申请了集成语音在线转写和语音在线合成两大功能的应用,所以仅需要同一个APPID,导入到同一个SDK即可。开发过程中,我们将SDK源码中关于语音合成的APPID更改为我们系统的ID,在activity文件中,设置语音合成的参数,其中需要设置参数包括发音人、语调、语速、音量等。由于采用的是科大讯飞语音在线合成功能,因此,APP应用需要在联网的情况下使用,通过调用语音合成方法,将该方法中的参数,即合成内容,发送到科大讯飞与服务器中,并接收服务器返回的音频文件进行播放。

 

二、代码分析

1.创建 SpeechSynthesizer 对象

SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);

 <!--语音合成,又称文语转换(Text to Speech,TTS)技术,解决的主要问题 是如何将文字信息转化为可听的声音信息(即音频数据)。-->

2.设置合成参数

//2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类
//设置发音人(更多在线发音人,用户可参见)
mTts.setParameter(SpeechConstant. VOICE_NAME, "xiaoyan" ); // 设置发音人
mTts.setParameter(SpeechConstant. SPEED, "20" );// 设置语速
mTts.setParameter(SpeechConstant. VOLUME, "80" );// 设置音量,范围 0~100
mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //设置云端
//设置合成音频保存位置(可自定义保存位置),保存在 “./sdcard/iflytek.pcm”
//保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
//仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码
//mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );

其中:

<!--VOICE_NAME-->

  public static final java.lang.String VOICE_NAME

<!--合成发音人-->

<!--通过此参数,在合成中使用不同的语言和方言性别等。设置发音人,语速、语调、音量,在一次合成时开始后,就会在合成的音频中生效,此时,若要中途改变这些参数,则应该从想要改变的文本处重新开始合成,因为已经返回的音频 是无法再改变的。-->

<!--默认值: xiaoyan-->-->

<!--SPEED-->

 public static final java.lang.String SPEED

<!合成语速-->

<!--通过此参数,设置合成返回音频的语速。-->

<!--是否必须设置:否-->

<!--默认值:50-->

<!--值范围:[0, 100]-->

<!--VOLUME-->

 public static final java.lang.String VOLUME

<!合成音量-->

<!--通过此参数,设置合成返回音频的音量。合成音量,影响的是合成到的音频本身的 音量大小(振幅),而非播放时系统的音量。关于播放时操作系统的音量,则请自行 查找操作系统相关API开发接口说明。-->

<!--是否必须设置:否-->

<!--默认值:50-->

<!--值范围:[0, 100]-->

<!--ENGINE_TYPE-->

public static final java.lang.String ENGINE_TYPE

<!引擎类型-->

<!--设置使用的引擎类型:在线、离线。在申请了离线合成资源和权限, 可以选择使用本地或在线的方式进行语音服务。-->

<!--使用在线模式([`TYPE_CLOUD`]又称云端模式)时,需要使用网络,产生一定流量,但有更好的识别 或合成的效果,如更高的识别匹配度,更多的发音人等。-->

<!--使用离线模式([`TYPE_LOCAL`]又称本地模式)时,不需要使用网络,且识别和合成的速度更快。-->

3.开始合成

mTts.startSpeaking( textBeSpeak, new MySynthesizerListener()) ;

<!--startSpeaking-->

public int startSpeaking(java.lang.String text,SynthesizerListener listener)

参数: text - 待合成的文本 listener - 合成状态监听器

<!--开始合成 调用此函数,开始合成文本并播放音频。-->

4.设置合成状态监听器

class MySynthesizerListener implements SynthesizerListener {@Overridepublic void onSpeakBegin() {// Log.d(TAG," 开始播放 ");}@Overridepublic void onSpeakPaused() {// showTip(" 暂停播放 ");}@Overridepublic void onSpeakResumed() {// showTip(" 继续播放 ");}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos ,String info) {// 合成进度}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError error) {if (error == null) {Speech();} else if (error != null ) {// showTip(error.getPlainDescription( true));}}@Overridepublic void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {}
}

 其中Speech()在首页语音识别合成中已经介绍。

5. 五个speakText类函数的作用

相信大家在刚看到代码时,会很纳闷,为啥要定义四个相似的函数,但是请仔细分析代码,这五个函数其实用于四个不同功能函数的调用。也就是对前两个板块的总结。

5.1 speakText()的作用

代码示例

private void speakText(String textBeSpeak) {...mTts.startSpeaking( textBeSpeak, new MySynthesizerListener()) ;
}
class MySynthesizerListener implements SynthesizerListener {...@Overridepublic void onCompleted(SpeechError error) {if (error == null) {Speech();} else if (error != null ) {// showTip(error.getPlainDescription( true));}}...
}

该函数调用功能函数Speech(),其作用是:执行通过rfid射频技术实现的确定当前位置。(Speech()具体代码在我另一篇博客——语音识别合成中)

5.2 speakText1()的作用

代码示例

private void speakText1(String textBeSpeak) {...mTts.startSpeaking( textBeSpeak, new MySynthesizerListener1()) ;
}
class MySynthesizerListener1 implements SynthesizerListener {...@Overridepublic void onCompleted(SpeechError error) {if (error == null) {daoda = false;vitSpeech();}else if (error != null ) {// showTip(error.getPlainDescription( true));}}...
}

该函数调用功能函数vitSpeech(),其作用是:导航听写,利用rfid射频技术实现的确定当前位置并获取目的地。

5.3 speakText2()的作用

代码示例

private void speakText2(String textBeSpeak) {...mTts.startSpeaking( textBeSpeak, new MySynthesizerListener2()) ;
}
class MySynthesizerListener2 implements SynthesizerListener {
​...@Overridepublic void onCompleted(SpeechError error) {if (error == null) {if(kaiqi){route();}else{route1();}}else if (error != null ) {}}...
}

该函数根据if条件判断分别调用route()和route1(),其作用是:导向方法,其中route()和route1()的区别在route()增加开启识别前方障碍物并打开相机。

  if (!takephoto && distance <= 50) {wancheng = true;takephoto = true;try {speakText2("识别到前方有障碍物。正在识别中,请稍候!");sleep(1000);} catch (InterruptedException e) {//InterruptedException 异常处理//printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。e.printStackTrace();} finally {//打开相机turnOnCamera();
//                            rev_tv.post(new Runnable() {
//                                @Override
//                                public void run() {
//                                    photo_btn.performClick();
//                                }
//                            });}while(wancheng){
​}}

5.4 speakText4()的作用

代码示例

private void speakText4(String textBeSpeak) {...mTts.startSpeaking( textBeSpeak, new MySynthesizerListener4()) ;
}
class MySynthesizerListener4 implements SynthesizerListener {...@Overridepublic void onCompleted(SpeechError error) {if (error == null) {Speech2();} else if (error != null ) {// showTip(error.getPlainDescription( true));}}...
}

该函数根据if条件判断当程序正常执行时,调用Speech2(),其作用是:启动路况识别功能并获取目的地。

5.5 speakText3()的作用

代码示例

private void speakText3(String textBeSpeak) {...mTts.startSpeaking( textBeSpeak, new MySynthesizerListener2()) ;
}
class MySynthesizerListener3 implements SynthesizerListener {...@Overridepublic void onCompleted(SpeechError error) {if (error == null) {notifyAll();}else if (error != null ) {}}...
}

该函数根据if条件判断程序正常执行时调用notifyAll(),其作用是:使得所有功能函数可再执行。

其中:

Java Object notifyAll() 方法

用于唤醒在该对象上等待的所有线程。notifyAll() 方法跟 notify() 方法一样,区别在于 notifyAll() 方法唤醒在此对象监视器上等待的所有线程,notify() 方法是一个线程。如果当前线程不是对象监视器的所有者,那么调用 notifyAll() 方法同样会发生 IllegalMonitorStateException 异常。(确保所有线程都有一次再执行的权力)


总结

嵌入式系统,基于Android+科大讯飞语音识别、语音合成、语音提示技术以及RFID射频识别技术、蓝牙连接、路况标识等功能集合而成的导航语音识别合成之读后听写语音识别(功能函数调用)


http://chatgpt.dhexx.cn/article/7goSaEjJ.shtml

相关文章

嵌入式语音识别智能家居笔记1

1.环境 VMware 15.5 Ubuntu18.04 Qt安装包 2.共享目录设置 VMware->虚拟机->设置->选项->共享文件夹 3. QT的linux安装包&#xff1a;qt-opensource-linux-x64-5.9.1.run 复制到共享目录 打开终端&#xff1a; cd /mnt/hgfs/share sudo ./qt-opensour…

嵌入式语音识别系统之电路设计原理

现在社会发展的这么快&#xff0c;什么高科技都涌现出来&#xff0c;什么智能机器人啦&#xff0c;智能手机等&#xff0c;有很多在这里就不一一列举了&#xff0c;在这里我们要说的就是语音识别系统了&#xff0c;现在嵌入式产品如此的多&#xff0c;就像一些智能空调啦&#…

我们基于kaldi开发的嵌入式语音识别系统升级成深度学习啦

先前的文章《三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的 》说我们花了不到三个月的时间搭了一个基于kaldi的嵌入式语音识别系统&#xff0c;不过它是基于传统的GMM-HMM的&#xff0c;是给我们练手用的&#xff0c;通过搭这个系统我们累积了一定的语音…

三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的

前面的博客里说过最近几个月我从传统语音&#xff08;语音通信&#xff09;切到了智能语音&#xff08;语音识别&#xff09;。刚开始是学语音识别领域的基础知识&#xff0c;学了后把自己学到的写了PPT给组内同学做了presentation&#xff08;语音识别传统方法(GMMHMMNGRAM)概…

【毕业设计】基于stm32的语音识别 - 单片机 嵌入式 物联网 语音识别

文章目录 0 简介1 项目目标2 项目背景意义3 需求分析3.1 功能性需求3.2 非功能性需求 4 设备器件4.1 STM32单片机4.2 LD3320语音识别芯片4.3 TFT-LCD液晶显示屏 5 设计方案6 语音识别模块的开发7 报警电路模块的开发8 上位机模块的开发9 项目成果9 最后 0 简介 Hi&#xff0c;…

基于80251的嵌入式语音识别

一、文档介绍 嵌入式语音识别技术在251内核的实现。 缩写、术语 解 释 Specific Person Isolated Word Speech Recognition 特定人孤立词语音识别 Endpoint detection 端点检测 Feature parameter extraction 特征参数提取 DTW (Dynamic Time Warping) 动态时间规整…

嵌入式linux 声控,基于Cortex-A9的嵌入式语音识别系统设计

打开文本图片集 摘 要:在人工智能技术发展的进程中,语音识别已经成为重要分支之一。语音识别技术作为人与机器的一种交互方式,将前端处理之后的信号转换成文本或者指令,进而用于控制相关智能设备。当前,基于深度学习的云端语音识别技术已经逐渐成熟,但考虑到离线设备无法…

《嵌入式 - 语音识别TWen-ASR-ONE开发笔记》第3章 TWen-ASR-ONE 多线程和消息队列

3.1 Scratch简介 在开始本章之前&#xff0c;需要介绍下TWen-ASR-ONE的用户开发语言-Scratch&#xff0c;Scratch是麻省理工学院开发的一款简易图形化编程工具主要是为青少年开发的一种编程工具&#xff0c;它图形化编程工具当中最广为人知的一种形式&#xff0c;所有人都可以…

Android导航语音识别——语音听写(嵌入式)

嵌入式项目之Android导航语音识别——语音听写 文章目录 系列文章目录前言一、原理流程图二、语音听写 1.初始化无ui识别听写2.设置识别监听器3.启动功能总结 前言 最近在学习嵌入式系统的一个功能——导航语音识别&#xff0c;该功能是基于Android和科大讯飞语音识别语音合成…

static的三个作用

static作用 一、修饰局部变量-静态局部变量二、修饰全局变量-静态全局变量三、修饰函数-静态函数四、总结和注意点 一、修饰局部变量-静态局部变量 static修饰局部变量时&#xff0c;改变了变量的生命周期&#xff0c;让静态局部变量出了作用域依然存在&#xff0c;到程序结束&…

java中的静态变量的作用域_详解JAVA中static的作用

1、深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用;如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的;如果是说 可以构成 静态代码块,那别人认为你还可以; 如果你说可以构成 静态内部类, 那别人认为你不错;如果你说了静态导包,那别人认为你…

express.static 作用及用法

express相信是很多人用nodejs搭建服务器的首选框架&#xff0c;相关教程有很多&#xff0c;也教会了大家来如何使用。如果你想更深的了解他的细节&#xff0c;不妨和我一起来研究一下。 先来看一个每个人都用到的方法app.use(express.static(__dirname/public)); 你肯定在你的a…

java static的作用

static是什么 static是java中的关键字&#xff0c;static表示”全局”、“静态”的意思&#xff0c;用来修饰成员变量和成员方法&#xff0c;定义的变量&#xff0c;我们通常将用static修饰的成员称为静态变量&#xff0c;静态方法或者静态成员。 static的作用 被static修饰…

static的作用有哪些?

C语言中的static的作用有&#xff1a;1.修饰局部变量。2.修饰全局变量。3.修饰函数。 1.修饰局部变量。 如图&#xff1a; 当只用int 定义变量a时,此时程序运行结果为&#xff1a; 程序运行结果为10个2&#xff0c;这是为什么呢&#xff1f;&#xff1f; 原因是此时的变量a为…

C语言中 static作用

在C语言中&#xff0c;static的字面意思很容易把我们导入歧途&#xff0c;其实它的作用有三条。隐藏保持数据持久初始化为0 该图是下面文字的总结&#xff1a; 1.先来介绍它的第一条也是最重要的一条&#xff1a;隐藏。 当我们同时编译多个文件时&#xff0c;所有未加static前…

C语言中static作用

1,static修饰局部变量 在局部变量之前加上关键字static&#xff0c;局部变量就被定义成为一个局部静态变量。 特点如下: 1&#xff09;存储区&#xff1a;由于栈变为静态存储区rw data&#xff0c;生存期为整个源程序&#xff0c;只能在定义该变量的函数内使用。退出该函…

对DSP的基本了解(一)--DSP是什么?

Preface&#xff1a;在学习一个新东西之前&#xff0c;我们需要对一些基本概念或者专业术语进行基本的理解&#xff0c;这样才能扫除壁垒&#xff0c;让学习更加高效。因此&#xff0c;DSP学习系列首先会比较注重对DSP相关术语上的理解。所以最开始&#xff0c;我们先来学习一些…

DSP学习

DSP数字电源学习一 软件环境搭建相关硬件资源TMS320C28x 32 位 CPU可编程控制律加速器 (CLA)片上存储器时钟和系统控制1.2V 内核、3.3V I/O 设计系统外设通信外设模拟系统 软件相关控制算法数据记录功能代码示例MathWorks Simulink 模型文档 由于最近工作需要&#xff0c;需要学…

DSP/BIOS详解入门

DSP/BIOS详解入门 百度百科DSPBIOS DSP/BIOS是TI公司特别为其TMS320C6000TM&#xff0c;TMS320C5000TM和TMS320C28xTM系列DSP平台所设计开发的一个尺寸可裁剪的实时多任务操作系统内核&#xff0c;是TI公司的Code Composer StudioTM开发工具的组成部分之一。 DSP/BIOS 实时操作…

DSP基础知识回顾

文章目录 1. 什么是DSP2. DSP与其他主流芯片的区别2.1 DSP与MCU的区别2.2 DSP与ARM的区别2.3 DSP与FPGA的区别 3. TI公司DSP具体型号的含义4. TMS320x2814的片内外设4.1 事件管理器4.2 模拟量转换为数字量的ADC采样模块4.3 串行通信接口SCI4.4 串行外围设备接口SPI4.5 局域网通…