分享好友 最新动态首页 最新动态分类 切换频道
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 : 释放语音合成的实例。 下面是百度语音合成的代码例子:

最新文章
香港银行支持的信用卡及相关信息一览
在全球金融中心之一的香港,银行业的发展和信用卡的使用已成为人们日常生活中不可或缺的部分。无论是本地居民还是海外游客,了解在香港可以使用哪些信用卡以及相关的银行服务,都是非常重要的。本文将从各个方面详细探讨“香港支持什么卡的
百度资源站长平台批量添加二级域名工具使用说明(20230221)
到目前为止软件运行比较稳定,在原有基础上增加了二级域名自动生成的功能。支持导入多账号支持账号自动切换支持账号受限停保账号支持备案ICP支持自定义站点领域支持滑动验证码及旋转验证码支持打码次数设置支持多线程运行支持多种打码平台
长沙晚报登报热线常德日报(挂失、模板)
登报电话:,电话,遗失声明,贵阳公告登报,登报挂失,在线登报
web 服务中上传文件大小控制
参考文章:https://rensanning.iteye.com/blog/2388353项目场景:Vue + Nginx + Java + TomcatNginx作为反向代理服务器,访问Tomcat中的后端项目。问题:项目需求将上传20M限制提高到20M,将web.xml中的multipart-config参数设置修改成20M
经典sql练习题(oracle版)
基础知识 之前看到的很多相关信息都是mysql、sqlserver完成习题的,所以就想做一份oracle完成习题的文档,供自己参考也供别人参考。 用到的表信息 学生信息表 Student(Sid,Sname,Sage,Ssex) Sid 学生学号,Sname 学生姓名,Sage
近3年重要会议对比:3大信号,9个方面的微妙变化!
更多创富机遇,请关注IPO蜜姐笔记! 撰文|蜜妹 这是@闺蜜财经的第1645篇原创终于,2024年末重要的一次会议近日落地。微妙的是,12月13日的股市却给出了一个似乎令人意外的走向。 这次会议到底说了什么,相信蜜友们看过许多。今天蜜妹想通过
性价比最高网站建设哪里好/百度推广代理商利润
Python语法入门、数据采集、文本分析(词典法)、文本分析进阶(机器学习)司继春:Stata基础与应用、OLS:解释与因果、面板数据分析、二元选择与非线性模型简介;王非:数据的获得及处理方法、工具变量法理论与实操、双重差
蛙漫
漫蛙是一款能够免费阅读各种热门漫画的漫画阅读软件,网友可通过搜索漫画关键词或漫画作者名字,快速找到自己喜欢的漫画,没有任何限制。该软件中拥有各种热门的漫画作品,画质十分清晰,让大家能够流畅地阅读漫画,不会出现卡顿或模糊的情
高清美女写真一键生成:AI工具评测与实用教程!
在这个充满创新的时代,科技的进步使得我们能够轻松创建出逼真、美丽的画像。在美女写真这一领域,AI画图工具的崛起让许多爱好者兴奋不已。当你在社交媒体上看到那些精美的美女写真时,是否曾想过背后是如何生成的?本篇文章将带你深入了解
谷歌应用商店app最新版(google play store)下载
2025谷歌play商店最新版也就是google play store,也叫作谷歌play商店,正版包名是com.android.vending。这是一个全球热门的流行游戏盒应用下载市场,可以下载全球热门排行榜的游戏,你可以知道哪些是现在最流行的游戏,而且还有很多热门国
相关文章
推荐文章
发表评论
0评