Android开发笔记(一百零八)智能语音

   日期:2024-12-26    作者:luyesteel188 移动:http://mip.riyuangf.com/mobile/quote/33705.html

如今越来越多的app用到了语音播报功能,例如地图导航、天气预报、文字阅读、口语训练等等。语音技术主要分两块,一块是语音转文字,即语音识别;另一块是文字转语音,即语音合成。 对中文来说,和语音播报相关的一个技术是汉字转拼音,想想看,拼音本身就是音节拼读的标记,每个音节对应一段音频,那么一句的拼音便能用一连串的音频流合成而来。汉字转拼音的说明参见《》。 语音合成通常也简称为TTS,即TextToSpeech(从文本到语言)。语音合成技术把文字智能地转化为自然语音流,当然为了避免机械合成的呆板和停顿感,语音引擎还得对语音流进行平滑处理,确保输出的语音音律流畅、感觉自然。

Android从1.6开始,就内置了语音合成引擎,即“Pico TTS”。该引擎支持英语、法语、德语、意大利语,但不支持中文,幸好Android从4.0开始允许接入第三方的语音引擎,因此只要我们安装了中文引擎,就能在代码中使用中文语音合成服务。例如,在各大应用市场上下载并安装科大讯飞+,然后在手机操作“系统设置”——“语言和输入法”——“文字转语音(TTS)输出”,如下图所示即可设置中文的语音引擎:

Android的语音合成控件类名是TextToSpeech,下面是该类常用的方法说明: 构造函数 : 第二个参数设置TTSListener对象,要重写onInit方法(通常在这里调用setLanguage方法,因为初始化成功后才能设置语言)。第三个参数设置语音引擎,默认是系统自带的pico,要获取系统支持的所有引擎可调用getEngines方法。 setLanguage : 设置语言。英语为Locale.ENGLISH;法语为Locale.FRENCH;德语为Locale.GERMAN;意大利语为Locale.ITALIAN;汉语普通话为Locale.CHINA(需安装中文引擎,如科大讯飞+)。该方法的返回值有三个,0表示正常,-1表示缺失数据,-2表示不支持该语言。 setSpeechRate : 设置语速。1.0正常语速;0.5慢一半的语速;2.0;快一倍的语速。 setPitch : 设置音调。1.0正常音调;低于1.0的为低音;高于1.0的为高音。 speak : 开始对指定文本进行语音朗读。 synthesizeToFile : 把指定文本的朗读语音输出到文件。 stop : 停止朗读。 shutdown : 关闭语音引擎。 isSpeaking : 判断是否在语音朗读。 getLanguage : 获取当前的语言。 getCurrentEngine : 获取当前的语音引擎。 getEngines : 获取系统支持的所有语音引擎。 下面是TextToSpeech处理语音合成的代码示例:

前面提到,只要安装了中文引擎,即可在TextToSpeech中使用中文语音;可是我们没法要求用户再额外下载一个app,正确的做法是在自己app中集成语音sdk。目前中文环境常见的语音sdk主要有科大讯飞、百度语音、捷通华声、云知声等等,开发者可自行选择一个。

科大讯飞语音sdk的集成步骤如下: 1、导入sdk包到libs目录,包括libmsc.so、Msc.jar、Sunflower.jar; 2、到讯飞网站注册并创建新应用,获得appid; 3、自定义一个Application类,在onCreate函数中加入下面代码,注意appid值为第二步申请到的id:

4、在AndroidManifest.xml中加入必要的权限,以及自定义的Application类; 5、根据demo工程编写代码与布局文件; 6、如果使用了RecognizerDialog控件,则要把demo工程assets目录下的文件原样拷过来; 7、在混淆打包的时候需要添加-keep class com.iflytek.**{*;},

科大讯飞的语音识别用的是SpeechRecognizer类,主要方法如下: createRecognizer : 创建语音识别对象。 setParameter : 设置语音识别的参数。常用参数包括: --SpeechConstant.ENGINE_TYPE : 设置听写引擎。TYPE_LOCAL表示本地,TYPE_CLOUD表示云端,TYPE_MIX表示混合。 --SpeechConstant.RESULT_TYPE : 设置返回结果格式。json表示json格式。 --SpeechConstant.LANGUAGE : 设置语言。zh_cn表示中文,en_us表示英文。 --SpeechConstant.ACCENT : 设置方言。mandarin表示普通话,cantonese表示粤语,henanese表示河南话。 --SpeechConstant.VAD_BOS : 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理。 --SpeechConstant.VAD_EOS : 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入,自动停止录音。 --SpeechConstant.ASR_PTT : 设置标点符号。0表示返回结果无标点,1表示返回结果有标点。 --SpeechConstant.AUDIO_FORMAT : 设置音频的保存格式。 --SpeechConstant.ASR_AUDIO_PATH : 设置音频的保存路径。 --SpeechConstant.AUDIO_SOURCE : 设置音频的来源。-1表示音频流,与writeAudio配合使用;-2表示外部文件,同时设置ASR_SOURCE_PATH指定文件路径。 --SpeechConstant.ASR_SOURCE_PATH : 设置外部音频文件的路径。 startListening : 开始监听语音输入。参数为RecognizerListener对象,该对象需重写的方法包括: --onBeginOfSpeech : 内部录音机已经准备好了,用户可以开始语音输入。 --onError : 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 --onEndOfSpeech : 检测到了语音的尾端点,已经进入识别过程,不再接受语音输入。 --onResult : 识别结束,返回结果串。 --onVolumeChanged : 语音输入过程中的音量大小变化。 --onEvent : 事件处理,一般是业务出错等异常。 stopListening : 结束监听语音。 writeAudio : 把指定的音频流作为语音输入。 cancel : 取消监听。 destroy : 回收语音识别对象。 下面是科大讯飞语音识别的运行截图:

下面是科大讯飞语音识别的代码例子:

科大讯飞的语音合成用的是SpeechSynthesizer类,主要方法如下: createSynthesizer : 创建语音合成对象。 setParameter : 设置语音合成的参数。常用参数包括: --SpeechConstant.ENGINE_TYPE : 设置合成引擎。TYPE_LOCAL表示本地,TYPE_CLOUD表示云端,TYPE_MIX表示混合。 --SpeechConstant.VOICE_NAME : 设置朗读者。默认xiaoyan(女青年,普通话) --SpeechConstant.SPEED : 设置朗读的语速。 --SpeechConstant.PITCH : 设置朗读的音调。 --SpeechConstant.VOLUME : 设置朗读的音量。 --SpeechConstant.STREAM_TYPE : 设置音频流类型。默认是音乐。 --SpeechConstant.KEY_REQUEST_FOCUS : 设置是否在播放合成音频时打断音乐播放,默认为true。 --SpeechConstant.AUDIO_FORMAT : 设置音频的保存格式。 --SpeechConstant.TTS_AUDIO_PATH : 设置音频的保存路径。 startSpeaking :  开始语音朗读。参数为SynthesizerListener对象,该对象需重写的方法包括: --onSpeakBegin : 朗读开始。 --onSpeakPaused : 朗读暂停。 --onSpeakResumed : 朗读恢复。 --onBufferProgress : 合成进度变化。 --onSpeakProgress : 朗读进度变化。 --onCompleted : 朗读完成。 --onEvent : 事件处理,一般是业务出错等异常。 synthesizeToUri : 只保存音频不进行播放,调用该接口就不能调用startSpeaking。第一个参数是要合成的文本,第二个参数时要保存的音频全路径,第三个参数是SynthesizerListener回调接口。 pauseSpeaking : 暂停朗读。 resumeSpeaking : 恢复朗读。 stopSpeaking : 停止朗读。 destroy : 回收语音合成对象。 下面是科大讯飞语音合成的代码例子:

科大讯飞的demo工程在设置页面使用了PreferenceActivity,看起来代码简炼了许多,正好我们之前还没接触Preference的实际运用,现在就来研究研究。看最新的sdk源码,提示PreferenceActivity的许多方法都过时了,官方建议使用PreferenceFragment来代替。 下面是PreferenceFragment的常用方法说明 getPreferenceManager : 获得参数管理的PreferenceManager对象。该对象主要有两个方法:getDefaultSharedPreferences返回系统默认的共享参数对象;setSharedPreferencesName为设置指定名称的共享参数;有关共享参数的说明参见《》。 addPreferencesFromResource : 从xml资源文件中添加参数界面。 findPreference : 从xml资源文件中获取指定id的元素。EditTextPreference表示该项参数为文本输入;ListPreference表示该项参数为列表选择;CheckBoxPreference表示该项参数为复选框勾选;PreferenceScreen是xml文件的根节点。 setPreferenceScreen : 设置参数屏幕(一般不使用)。 下面是PreferenceFragment的代码示例:

下面是PreferenceFragment的布局示例:

百度语音sdk的集成比较麻烦,主要步骤如下: 1、导入sdk包到libs目录,包括语音识别和语音合成两种库 语音识别的库有: libbdEASRAndroid.so libBDVoiceRecognitionClient_MFE_V1.so VoiceRecognition-2.0.1.jar 语音合成的库有: libbd_etts.so libBDSpeechDecoder_V1.so libbdtts.so libgnustl_shared.so com.baidu.tts_2.2.7.20160616_81bcb05_release.jar galaxy-v2.0.jar 2、到百度注册并创建新应用,获得APP_ID、API_KEY、SECRET_KEY; 3、在AndroidManifest.xml中加入必要的权限,以及meta-data、service和activity设置,注意meta-data的参数值为第二步获得的APP_ID、API_KEY、SECRET_KEY。详细的xml部分例子如下:

4、demo工程中assets目录下的文件原样拷过来; 5、demo工程中res目录下的drawable、layout、raw下面的资源原样拷过来; 6、根据demo工程编写代码与布局文件,注意在语音合成初始化时,setAppId和setApiKey要把第二步获得的APP_ID、API_KEY、SECRET_KEY给填进去; 下面是我在集成百度语音时遇到的几个问题及处理办法: 1、语音合成运行报错,日志提示: 06-21 16:31:37.118: W/System.err(4595): Caused by: java.util.concurrent.ExecutionException: java.lang.Exception: #5, Other client side errors. request token failed, error: unknown, desc: unknown client id, used AK=this/this 原因:setAppId和setApiKey方法没有设置appkey。 2、语音合成运行报错,日志提示: 06-21 16:32:57.830: W/System.err(4769): java.lang.Exception: #5, Other client side errors. The AK can only be used for demo. AK=8MAxI5o7VjKSZOKeBzS4XtxO/Ge5GXVdGQpaxOmLzc8fOM8309ATCz9Ha 原因:setAppId和setApiKey方法设置的值不对,可能使用了demo的appkey,而不是自己申请的appkey。 3、语音合成运行报错,日志提示: 06-22 11:32:00.998: W/MainActivity(31928): onError error=(-15)(-15)online synthesize get was timeout[(cause)java.util.concurrent.TimeoutException]--utteranceId=0 原因:网络连不上,请检查网络连接。如果使用模拟器测试,最好重启模拟器再试试 4、调用loadEnglishModel方法加载英语模块时,返回值是-11加载失败(正常要返回5)。 原因:加载离线英文资源需要在初始化时采用混合模式TtsMode.MIX,不可采用在线模式TtsMode.ONLINE。

百度语音识别用的是SpeechRecognizer类,主要方法如下: createSpeechRecognizer : 创建语音识别对象。 setRecognitionListener : 设置识别监听器。该监听器需重写的方法包括: --onReadyForSpeech : 准备就绪,可以开始说话 --onBeginningOfSpeech : 检测到用户已经开始说话 --onRmsChanged : 一般不用处理。 --onBufferReceived : 一般不用处理。 --onEndOfSpeech : 检测到用户已经停止说话 --onError : 识别出错。 --onResults : 识别完成,返回结果串。 --onPartialResults : 返回部分的识别结果。 --onEvent : 事件处理,一般是业务出错等异常。 startListening : 开始监听语音。 stopListening : 结束监听语音。 cancel : 取消监听。 destroy : 回收语音识别对象。 注意第一次识别时要跳到com.baidu.action.RECOGNIZE_SPEECH,后面才能调用startListening方法。识别时的参数设置是在activity跳转时传入的,常用参数包括: --Constant.EXTRA_LANGUAGE : 说话的语言。cmn-Hans-CN表示普通话,sichuan-Hans-CN表示四川话,yue-Hans-CN表示粤语,en-GB表示英语。 --Constant.EXTRA_NLU : 是否开启语义解析。 --Constant.EXTRA_VAD : 语音边界检测。search表示适用输入搜索关键字(默认值),input表示适用于输入短信、微博等长句输入。 --Constant.EXTRA_PROP : 语音的行业领域。 下面是百度语音识别的运行截图:

下面是百度语音识别的代码例子:

百度语音合成用的是SpeechSynthesizer类,主要方法如下: getInstance : 获得语音合成的实例。 setContext : 设置语音合成的上下文。 setSpeechSynthesizerListener : 语音合成的监听器。该监听器需重写的方法包括: --onSynthesizeStart : 合成开始。 --onSynthesizeDataArrived : 一般不使用。 --onSynthesizeFinish : 合成结束。 --onSpeechStart : 朗读开始。 --onSpeechProgressChanged : 朗读进度变化。 --onSpeechFinish : 朗读结束。 --onError : 处理出错。 setAppId : 设置appid。 setApiKey : 设置apikey和secretkey。 auth : 对appid、apikey和secretkey进行鉴权。 initTts : 初始化。TtsMode.ONLINE表示在线合成,TtsMode.MIX表示混合(即在线与离线结合)。 setAudioStreamType : 设置音频流的类型。AudioManager.STREAM_MUSIC表示音乐。 setParam : 设置语音合成的参数。常用参数包括: --SpeechSynthesizer.PARAM_SPEAKER : 设置朗读者。0表示普通女声,1表示普通男声,2表示特别男声,3表示情感男声。 --SpeechSynthesizer.PARAM_VOLUME : 设置音量。取值范围为0-9,默认5。 --SpeechSynthesizer.PARAM_SPEED : 设置语速。取值范围为0-9,默认5。 --SpeechSynthesizer.PARAM_PITCH : 设置音调。取值范围为0-9,默认5。 --SpeechSynthesizer.PARAM_AUDIO_ENCODE : 设置音频的编码类型。一般设置SpeechSynthesizer.AUDIO_ENCODE_AMR。 --SpeechSynthesizer.PARAM_AUDIO_RATE : 设置音频的编码速率。一般设置SpeechSynthesizer.AUDIO_BITRATE_AMR_15K85。 loadEnglishModel : 加载英语模块。 speak : 开始合成并朗读。 pause : 暂停朗读。 resume : 恢复朗读。 stop : 停止朗读。 release : 释放语音合成的实例。 下面是百度语音合成的代码例子:


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号