讯飞语音唤醒、识别、合成

article/2025/9/13 2:38:59

文章目录

  • 讯飞SDK的使用
    • 官网SDK所提供的的文件
    • 官网Demo的使用
    • 自己新建工程导包步骤
  • 语音唤醒
  • 语音识别
  • 在线语音合成

讯飞SDK的使用

Demo链接:
语音唤醒 [link] (https://download.csdn.net/download/the_only_god/11376540)
语音识别 [link]
(https://download.csdn.net/download/the_only_god/11376705)
语音合成 [link] (https://download.csdn.net/download/the_only_god/11376705)

官网SDK所提供的的文件

官网链接 [link] (https://www.xfyun.cn/)
官网SDK所提供的的文件

  1. assets 和 res中的是资源文件。
  2. libs中的是关键类库文件,语音唤醒、离线命令词识别、在线语音合成所需要的类均在其中的Msc.jar文件中。
  3. smaple官网所提供的的例子。
  4. readme(呵呵)
  5. wordlist你在官网下载SDK时设置的语音唤醒词。
  6. realesse无关紧要,看看可以加深你对这个库的理解(调bug时可能救你一命)。

官网Demo的使用

新建android工程 —>file —>new —> import moudle —> 把smaple中的mscV5PlusDemo导入就OK了,然后根据编译器右下角的提示来就可以成功运行Demo了(挺好玩的)。一般所提供的的smaple,不仅仅包含你所选择的功能,还可能包含一些其它多功能。之后你就可以从mscV5PlusDemo中复制粘贴到自己app中。

自己新建工程导包步骤

  1. 将libs文件复制粘贴到 app中(最好只粘armeabi-v7a和Msc.jar经验之谈),右键Msc.jar点击add as library。
  2. 在main中建立jnLib文件,将armebi-v7a粘贴过去。
  3. 将assets复制到main下。
  4. 在srings.xml中添加app_id即讯飞给你的授权码。
    然后你就可以用包里的各种语音相关函数了(前提是你得会用)

语音唤醒

特别简单

  1. 创建VoiceWakeuper对象
private VoiceWakeuper mIvw;
mIvw = VoiceWakeuper.createWakeuper(this, null);
  1. 设置参数
mIvw = VoiceWakeuper.getWakeuper();
if (mIvw != null) {resultString = "";// 清空参数mIvw.setParameter(SpeechConstant.PARAMS, null);// 唤醒门限值,根据资源携带的唤醒词个数按照“id:门限;id:门限”的格式传入mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:" + curThresh);// 设置唤醒模式mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup");// 设置持续进行唤醒mIvw.setParameter(SpeechConstant.KEEP_ALIVE, "1");// 设置闭环优化网络模式mIvw.setParameter(SpeechConstant.IVW_NET_MODE, "0");// 设置唤醒资源路径mIvw.setParameter(SpeechConstant.IVW_RES_PATH, getResource());// 设置唤醒录音保存路径,保存最近一分钟的音频mIvw.setParameter(SpeechConstant.IVW_AUDIO_PATH, Environment.getExternalStorageDirectory().getPath() + "/msc/ivw.wav");mIvw.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");// 如有需要,设置 NOTIFY_RECORD_DATA 以实时通过 onEvent 返回录音音频流字节//mIvw.setParameter( SpeechConstant.NOTIFY_RECORD_DATA, "1" );
} 
  1. 获取资源路径
private String getResource() {final String resPath = ResourceUtil.generateResourcePath(WakeDemo.this, RESOURCE_TYPE.assets, "ivw/"+getString(R.string.app_id)+".jet");Log.d( TAG, "resPath: "+resPath );return resPath;
}
  1. 设置唤醒监听器
private WakeuperListener mWakeuperListener = new WakeuperListener() {@Overridepublic void onResult(WakeuperResult result) {Log.d(TAG, "onResult");if(!"1".equalsIgnoreCase(keep_alive)) {setRadioEnable(true);}try {String text = result.getResultString();JSONObject object;object = new JSONObject(text);StringBuffer buffer = new StringBuffer();buffer.append("【RAW】 "+text);buffer.append("\n");buffer.append("【操作类型】"+ object.optString("sst"));buffer.append("\n");buffer.append("【唤醒词id】"+ object.optString("id"));buffer.append("\n");buffer.append("【得分】" + object.optString("score"));buffer.append("\n");buffer.append("【前端点】" + object.optString("bos"));buffer.append("\n");buffer.append("【尾端点】" + object.optString("eos"));resultString =buffer.toString();} catch (JSONException e) {resultString = "结果解析出错";e.printStackTrace();}textView.setText(resultString);}@Overridepublic void onError(SpeechError error) {showTip(error.getPlainDescription(true));setRadioEnable(true);}@Overridepublic void onBeginOfSpeech() {}@Overridepublic void onEvent(int eventType, int isLast, int arg2, Bundle obj) {switch( eventType ){// EVENT_RECORD_DATA 事件仅在 NOTIFY_RECORD_DATA 参数值为 真 时返回case SpeechEvent.EVENT_RECORD_DATA:final byte[] audio = obj.getByteArray( SpeechEvent.KEY_EVENT_RECORD_DATA );Log.i( TAG, "ivw audio length: "+audio.length );break;}}@Overridepublic void onVolumeChanged(int volume) {}
};@Override
protected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy WakeDemo");// 销毁合成对象mIvw = VoiceWakeuper.getWakeuper();if (mIvw != null) {mIvw.destroy();}
}
  1. 开始监听
	mIvw.startListening(mWakeuperListener);

这就OK了

语音识别

  1. 创建语音识别对象
	private SpeechRecognizer mAsr;
mAsr = SpeechRecognizer.createRecognizer(this, mInitListener);     
private InitListener mInitListener = new InitListener() {@Override
public void onInit(int code) {Log.d(TAG, "SpeechRecognizer init() code = " + code);if (code != ErrorCode.SUCCESS) {showTip("初始化失败,错误码:"+code+",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");}
}};
  1. 构建语法
//构建语法
private void buildGrammer() {mLocalGrammar = FucUtil.readFile(this, "function.bnf", "utf-8");// 本地-构建语法文件,生成语法idtext.setText(FucUtil.readFile(this,"myfunction","utf-8"));mContent = new String(mLocalGrammar);//mAsr.setParameter(SpeechConstant.PARAMS, null);// 设置文本编码格式mAsr.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");// 设置引擎类型mAsr.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);// 设置语法构建路径mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, grmPath);// 设置资源路径mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());ret = mAsr.buildGrammar(GRAMMAR_TYPE_BNF, mContent, grammarListener);
}

语法构建监听器

//初始化语法构建监听器
GrammarListener grammarListener = new GrammarListener() {@Overridepublic void onBuildFinish(String grammarId, SpeechError error) {if (error == null) {mLocalGrammarID = grammarId;//showTip("语法构建成功:" + grammarId);} else {showTip("语法构建失败,错误码:" + error.getErrorCode() + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");}}
};

3.设置语音识别参数

//设置语音识别参数
public void setParam() {boolean result = true;// 清空参数//mAsr.setParameter(SpeechConstant.PARAMS, null);// 设置识别引擎mAsr.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);// 设置本地识别资源mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());// 设置语法构建路径mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, grmPath);// 设置返回结果格式mAsr.setParameter(SpeechConstant.RESULT_TYPE, "json");// 设置本地识别使用语法idmAsr.setParameter(SpeechConstant.LOCAL_GRAMMAR, mLocalGrammarID);mAsr.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, "-1");mAsr.setParameter(SpeechConstant.VAD_BOS, "4000");mAsr.setParameter(SpeechConstant.VAD_EOS, "1000");// 设置识别的门限值mAsr.setParameter(SpeechConstant.MIXED_THRESHOLD, "30");//mediaPlayer.release();//ret = mAsr.startListening(mRecognizerListener);if (ret != ErrorCode.SUCCESS) {showTip("识别失败,错误码: " + ret);}
}
  1. 语音识别监听器
private RecognizerListener mRecognizerListener = new RecognizerListener() {@Overridepublic void onVolumeChanged(int volume, byte[] data) {showTip("当前正在说话,音量大小:" + volume);Log.d(TAG, "返回音频数据:"+data.length);}@Overridepublic void onResult(final RecognizerResult result, boolean isLast) {if (null != result && !TextUtils.isEmpty(result.getResultString())) {Log.d(TAG, "recognizer result:" + result.getResultString());String text = "";if (mResultType.equals("json")) {text = JsonParser.parseGrammarResult(result.getResultString(), mEngineType);} else if (mResultType.equals("xml")) {text = XmlParser.parseNluResult(result.getResultString());}else{text = result.getResultString();}// 显示((EditText) findViewById(R.id.isr_text)).setText(text);} else {Log.d(TAG, "recognizer result : null");}}@Overridepublic void onEndOfSpeech() {// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入          showTip("结束说话");}@Overridepublic void onBeginOfSpeech() {// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入showTip("开始说话");}@Overridepublic void onError(SpeechError error) {showTip("onError Code:"    + error.getErrorCode());}@Overridepublic void onEvent(int eventType, int arg1, int arg2, Bundle obj) {// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因// 若使用本地能力,会话id为null// if (SpeechEvent.EVENT_SESSION_ID == eventType) {//    String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);//    Log.d(TAG, "session id =" + sid);// }}};private void showTip(final String str) {runOnUiThread(new Runnable() {@Overridepublic void run() {mToast.setText(str);mToast.show();}});
}
  1. 开始监听
 mAsr.startListening(mRecognizerListener);

是不是so easy

在线语音合成

还是按套路来

  1. 创建语音合成对象
	private SpeechSynthesizer mTts;
	mTts = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener);
	//初始化监听
private InitListener mTtsInitListener = new InitListener() {@Overridepublic void onInit(int code) {if (code != ErrorCode.SUCCESS) {showTip("初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");} else {// 初始化成功,之后可以调用startSpeaking方法// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,// 正确的做法是将onCreate中的startSpeaking调用移至这里//Speaking("欢迎使用voice");}}
};
  1. 设置语音合成参数
//语音合成参数设置
private void setTtsParam() {// 清空参数mTts.setParameter(SpeechConstant.PARAMS, null);//设置合成//设置使用云端引擎mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);//设置发音人mTts.setParameter(SpeechConstant.VOICE_NAME, voicerCloud);//mTts.setParameter(SpeechConstant.TTS_DATA_NOTIFY,"1");//支持实时音频流抛出,仅在synthesizeToUri条件下支持//设置合成语速、音调、音量、音频流类型mTts.setParameter(SpeechConstant.SPEED, mSharedPreferences.getString("speed_preference", "50"));mTts.setParameter(SpeechConstant.PITCH, mSharedPreferences.getString("pitch_preference", "50"));mTts.setParameter(SpeechConstant.VOLUME, mSharedPreferences.getString("volume_preference", "50"));mTts.setParameter(SpeechConstant.STREAM_TYPE, mSharedPreferences.getString("stream_preference", "3"));// 设置播放合成音频打断音乐播放,默认为truemTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/tts.wav");
}
  1. 语音合成监听器
 */
private SynthesizerListener mTtsListener = new SynthesizerListener() {@Overridepublic void onSpeakBegin() {showTip("开始播放");}@Overridepublic void onSpeakPaused() {showTip("暂停播放");}@Overridepublic void onSpeakResumed() {showTip("继续播放");}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos,String info) {// 合成进度mPercentForBuffering = percent;showTip(String.format(getString(R.string.tts_toast_format),mPercentForBuffering, mPercentForPlaying));}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度mPercentForPlaying = percent;showTip(String.format(getString(R.string.tts_toast_format),mPercentForBuffering, mPercentForPlaying));}@Overridepublic void onCompleted(SpeechError error) {if (error == null) {showTip("播放完成");} else if (error != null) {showTip(error.getPlainDescription(true));}}@Overridepublic void onEvent(int eventType, int arg1, int arg2, Bundle obj) {// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因// 若使用本地能力,会话id为null// if (SpeechEvent.EVENT_SESSION_ID == eventType) {//    String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);//    Log.d(TAG, "session id =" + sid);// }//实时音频流输出参考/*if (SpeechEvent.EVENT_TTS_BUFFER == eventType) {byte[] buf = obj.getByteArray(SpeechEvent.KEY_EVENT_TTS_BUFFER);Log.e("MscSpeechLog", "buf is =" + buf);}*/}
};
  1. 开始合成
mTts.startSpeaking(text, mTtsListener);

** It’s so easy too ! **


http://chatgpt.dhexx.cn/article/a8F4dD90.shtml

相关文章

语音认别---唤醒技术KWS介绍

语音认别---唤醒技术KWS介绍 由于目前终端(如手机)上的CPU还不足够强劲,不能让语音识别的各种算法跑在终端上,尤其现在语音识别都是基于深度学习来做了,更加不能跑在终端上,所以目前主流的语音识别方案是声…

【语音智能管家】之语音唤醒(附演示视频)

目录 一.语音唤醒引擎(snowboy) 1.获取源代码并编译 2.自定义自己的唤醒词(唤醒词:小贝) 3.测试 二、自定义响应 三、实现了智能语音音响--听音乐 后续延伸 【加群获取学习资料QQ群:901381280】 我设…

科大讯飞语音唤醒(Android)

前面的工程项目配置和语音识别差不多,但是需要从SDK的res文件夹中复制ivw文件夹粘贴到main下面的assets文件夹下面。具体的文件配置结构,我截个图给大家看看: 剩下的步骤就是两页代码了,附上! 首先是MyApplication中的…

【飞桨PaddleSpeech语音技术课程】— 语音唤醒

(以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) 1. KWS 概述 随着人工智能的飞速发展,市场上推出了各式各样的智能设备,AI 语音的发展更是使得语音助手成为各大智能终端设备必不可少的软件。语音是人类与设备最直接…

语音唤醒的具体技术方案

\qquad 昨天的文章说的是不同的语音激活检测技术,传送门今天要说的是这个技术中间的具体的语音唤醒技术。语音唤醒技术到目前已经经过了三代的发展了。 第一代的技术很好理解,就是先构建一些模板,然后遇到语音,和模板进行匹配&…

26、使用友善NanoPi NEO和外设硬件实现语音唤醒功能、目标检测功能、语音播报功能

基本思想:使用友善开发板进行目标检测和测试 第一步:查看教程和进行刷机http://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO/zh#.E4.B8.8B.E8.BD.BD.E7.B3.BB.E7.BB.9F.E5.9B.BA.E4.BB.B6 小开发板子还是蛮不错的~,友善也开始卷了。。…

科大讯飞Windows麦克风监听语音唤醒+语音识别demo

最近在学习如何应用API来实现语言交互系统的功能,所以打算写一篇文章来整理和记录自己了解API使用的过程。 有很多平台提供语音识别等功能的API,文章使用的是科大讯飞开发的API。使用讯飞开放平台SDK实现一个Windows语音交互demo 讯飞开放平台简介SDK的下…

讯飞语音——唤醒

讯飞语音唤醒 唤醒功能,顾名思义,通过语音,唤醒服务,做我们想做的事情。 效果图(开启应用后说讯飞语音或者讯飞语点唤醒) 源码下载 地址:http://download.csdn.net/detail/q4878802/9023213 步…

说话就能轻松操控,科大讯飞语音唤醒技术带来便利体验!

如果,紧箍咒失灵了,孙悟空还会听唐僧的话吗? 如果,专注驾驶途中,一声呼唤便可响应需求是否很方便? 如果,手机落在卧室的某个角落,轻轻唤醒便能找到是否心情舒畅? 现实生…

Android——百度语音唤醒

这篇文章我们主要介绍一下,百度语音唤醒。所谓语音唤醒是指说出指定的语音指令(自定义的唤醒词),使程序激活某个功能的能力。百度语音唤醒支持自定义唤醒词。我做过讯飞的语音唤醒,这两个比较起来,讯飞的语音唤醒整体效果比百度要好。百度的语音唤醒功能需要使用唤醒词评…

androidstudio的语音唤醒功能

Manifest配置 写在application之外 <uses-permission android:name"android.permission.RECORD_AUDIO" /><uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name"android.permiss…

国内那几家语音唤醒技术做的比较好? 语音唤醒技术哪家强?

编辑导语&#xff1a; 随着语音交互技术的日渐成熟&#xff0c;越来越多的智能硬件都选择增加语音能力作为产品卖点之一。但是&#xff0c;设备在进入语音交互工作状态的时候&#xff0c;需要先进行唤醒操作。 常见的唤醒语音交互的操作有按键或者触屏形式&#xff0c;但是&…

语音唤醒工具:WeKWS

1 简介 本文根据2022年10月《WEKWS: A PRODUCTION FIRST SMALL-FOOTPRINT END-TO-END KEYWORD SPOTTING TOOLKIT 》翻译总结的。作者为西北工业大学航海学院张晓雷老师团队、西工大音频语音与语言处理研究组谢磊老师团队、WeNet 开源社区等。 WeKWS是一个可以投入生产使用、容…

讯飞语音开发之语音唤醒

只有前面讲到的语音合成&#xff0c;语音理解&#xff0c;语义理解&#xff0c;语音识别确实可以实现人机交流。但是还不能实现完全智能&#xff0c;不能狗做到实时问道&#xff0c;间歇式问答。要实现实时问答&#xff0c;切不用手动操作。这时候语音唤醒功能就大选伸手了。下…

百度语音唤醒

一&#xff1a;前期准工作 &#xff08;1&#xff09;进入百度开放平台&#xff0c;注册账号&#xff0c;创建应用&#xff0c;拿到应用相对应的 AppID&#xff0c;API密钥&#xff0c;密钥 &#xff08;2&#xff09;配置相关信息 <uses-permission android:name"an…

语音唤醒原理

百度语音唤醒时的日志 D/audio_hw_primary: adev_open_input_stream is_karaoke_fastcapture0 D/audio_hw_primary: adev_open_input_stream: enter: sample_rate(16000) channel_mask(0x10) devices(0x80000004) stream_handle(0xf3439a00) io_handle(454) source(1) …

语音唤醒功能篇

语音唤醒功能 语音唤醒使得系统中的各个功能模块能够很好的分隔开来。用户通过唤醒词“依米”唤醒系统&#xff0c;发送语音指令&#xff0c;系统检测到语音指令中的关键词&#xff0c;然后去执行相对应的功能。当系统执行完成后&#xff0c;便进入等待下一次被唤醒状态&#…

语音唤醒

语音唤醒 前言一、语音唤醒相关环境搭建二、使用步骤1.使用流程2.示例代码 总结 前言 针对语音交互过程&#xff0c;提供了一种语音唤醒的方法供大家参考&#xff0c;语音交互采用snowboy离线语音唤醒引擎&#xff0c;snowboy已经被kitt.AI团队下架&#xff0c;但我们仍能够在…

语音唤醒简单说明

随着 Echo 出现,all in one 音响类产品雏形开始显现,语音交互成为最直接的控制方式,Amazon Echo作为最佳代表,智能语音交互成为互联网入口的新价值所在。ABI Research 在 2017 年収布的预测报告指出,估计到 2022 年,支持语音控制的装置出货量将达到 7500万台,其中智能喇…

语音唤醒技术的原理是什么?

https://www.toutiao.com/a6644766450860950024/ 2019-01-10 15:27:29 “天猫精灵。”“哎&#xff0c;在的&#xff0c;你说” “小爱同学&#xff0c;定明天早上8点的闹钟。”“好的&#xff0c;已经帮你定好明天早上8点的闹钟” 不少同学家里都有AI智能音箱产品&#xff0…