分享好友 最新动态首页 最新动态分类 切换频道
Android开发笔记(一百零八)智能语音
2024-12-26 08:43

如今越来越多的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 : 释放语音合成的实例。 下面是百度语音合成的代码例子:

最新文章
齐思头条2024/12/10「Google量子计算芯片Willow突破,OpenAI发布SORA视频生成工具,Elon Musk多星球意识愿景,AI驱动脑部扫描技术效率翻倍,OpenAI推出Sora
## Twitter:**Google的量子计算突破** :Google推出了最先进的量子计算芯片Willow,显著减少了随着量子比特增加而产生的错误,解决了一个需要超级计算机超过10^25年才能完成的计算,详细信息见[Sundar Pichai的推文](https://news.miraclep
极越闪崩员工提9大诉求,晚上11点还在谈,智驾不能用老车主破防
作者 |Janson编辑 |志豪12月12日深夜23点极越汽车总部仍然灯火通明,极越CEO夏一平已经和员工代表沟通了数个小时,但事情进展并不顺利。从流传的一张图片上来看,昨晚23点,极越汽车CEO夏一平会议室中单手托腮,做思考状,内部还有疑似员
深化改革善作为 干在实处勇争先
  □中共仙游县委理论学习中心组  一、发展出题目,改革做文章  习近平总书记指出,“改革开放是党和人民事业大踏步赶上时代的重要法宝,是党和国家保持生机活力的关键,是当代中国最鲜明的特色,也是当代中国共产党人最鲜明的品格”
阿里搜索中台开发运维一体化实践
面对挑战,阿里选择走上中台开发运维一体化实践之路。这条路究竟要怎么走?下面跟随阿里搜索事业部高级技术专家柳明,一起来了解。背景阿里搜索中台的初心是支持前台业务更敏捷更快速适应市场的变化,愿景是让天下没有难用的搜索,基于初心
限量版热销中 一汽丰田普拉多英雄会郑州续写越野传奇
英雄之路,并非与他人争锋,而是一场自我超越的漫长征途。从漠河的“越冻越野”,到新疆的穿越百公里荒漠,再到宁波热带风情中大秀潮酷,一汽丰田 “英雄会” 一路走来,留下诸多精彩瞬间。12 月 14 日,“普拉多英雄会” 第四站将在郑州盛
韩国非常大度的电影原声到底多厉害?网友:别犹豫,这个OST真的值得单曲循环!
韩国非常大度的电影原声,这个关键词最近频频出现在热搜榜上。有人说,这部电影还没完全看懂,但配乐早已深入灵魂。片中多段配乐将角色的情感展现得淋漓尽致,从低沉到高亢的旋律仿佛将观众带入了另一个世界。特别是一首OST,不仅在影院中
面试被问项目架构是什么样
在软件开发中,项目架构是指软件系统的顶层结构和各个部分之间的关系。它包括组件的分割、接口的定义、数据流和控制流的安排等。良好的项目架构可以提高系统的可维护性、可扩展性和可重用性。本文将通过一个简单的示例来探讨项目架构的基本
男人会惦记黑名单里的女人吗:不会
  男人会惦记黑名单里的女人吗?一般不会,因为男人还爱你就不会拉你进黑名单,也不会删除你,只有真的绝情之人以及你们发生很大的事情导致他对你失去了信任或者爱,所以他拉你进黑名单,他拉黑你就是不想和你纠缠下去了,所以他暂时不会
鲁山县背孜乡人大:聚焦中草药产业发展 助农带农跑出增收“加速度”
  河南省人大融媒体中心讯(记者 贺志泉 通讯员 武乐乐)春耕时节,鲁山县背孜乡中草药产业人大代表联络站的驻站代表们纷纷在田间地头忙碌着。在该乡郜沟村的丹参育苗基地里,代表联络站站长张红杰正在指导群众如何移苗栽种。  鲁山县
萨摩耶云科技集团林建明:ChatGPT推动模型迈向超级决策智能阶段
  “我们面临的是对社会的彻底重新定义,以及人类即将过时。”美国学者、专栏作家弗兰克,深入研究ChatGPT后发出了深深地感叹。2022年春节档电影《流浪地球2》为亿万观众奉上了一场科幻盛宴。“MOSS,人类能活下来吗?”电影中刘培强与具
相关文章
推荐文章
发表评论
0评