20.5 语音合成(百度2016年2月29日发布的tts引擎)

一、简介

编写手机App时,有时需要使用文字转语音(Text to Speech)的功能,比如开车时阅读收到的短信、导航语音提示、界面中比较重要的信息通过语音强调、……等。

由于Android自带的Pico TTS并不支持中文,所以要既能阅读中文文本,还能阅读英文文本,必须下载第三方提供的能说中文的语音包。

二、申请百度tts授权

本节以百度2016年2月29日发布的“离在线融合语音合成SDK_Android 2.2.3版”为例说明用C#实现语音合成的基本用法。之所以选择百度语音合成来实现,是因为据百度官网声明,该开发包是“永久免费”的。网址如下:

http://yuyin.baidu.com/tts/

由于原来已经申请过MyDemos的授权,所以再继续申请tts授权就比较简单了,申请和设置步骤如下。

1、申请授权

进入 http://yuyin.baidu.com/tts/ 的首页:

单击【立即使用】,进入“开通语音合成服务”的页面:

在下拉框中选择原来已经申请的某个应用,单击【下一步】,然后按提示操作,开通离线服务即可。

2、在BdMapV371BindingLib项目中转换JAR文件

先通过 http://yuyin.baidu.com/tts/ 首页中的【相关下载】下载对应的开发包,然后再按下面的步骤操作。

1、将示例中的com.baidu.tts_2.2.3.20160229_359d952_release.jar、galaxy-v2.0.jar添加到Jars文件夹下,如下图所示,然后将其【生成操作】属性全部设置为“EmbeddedJar”。

2、在Metadata.xml文件中添加下面的语句:

<remove-node path="/api/package[@name='com.baidu.tts.aop']/interface[@name='IProxyFactory']/method[@name='createProxied' and count(parameter)=0]" />

3、重新生成项目,此时应该无错误。

经过这3个步骤,就完成了tts的Jar包导入和转换为.cs文件的过程。

3、在MyDemos项目中添加.so文件

将tts相关的4个.so文件添加到MyDemos项目的x86文件夹下,如下图所示,然后将其【生成操作】属性全部设置为“AndroidNativeLibrary”。

4、将.dat文件添加到sd卡的BaiduTTS文件夹下

具体添加办法见【常见问题解答】,这里不再截图。

也可以先将这些文件添加到Assets文件夹下,然后通过代码将其复制到sd卡的文件夹下。为简化起见,这里通过手工直接复制了。

OK,经过上面这4步,以后就可以在MyDemos项目中的任何模块中轻松利用百度tts实现语音阅读的功能了

三、示例

1、运行截图

单击【阅读】,就会自动用女音朗读文本框中的内容,单击【批量阅读】,就会依次朗读队列中添加的文字段(主要是为了演示阅读各种不同的中英文短句)。

2、设计步骤

(1)添加ch2005Main.axml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="50dp" android:orientation="horizontal" android:weightSum="4"> <Button android:id="@+id/speak" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:text="阅读" android:textSize="12dp" /> <Button android:id="@+id/pause" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:text="暂停" android:textSize="12dp" /> <Button android:id="@+id/resume" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:text="继续" android:textSize="12dp" /> <Button android:id="@+id/stop" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:text="停止" android:textSize="12dp" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="50dp" android:orientation="horizontal" android:weightSum="4"> <Button android:id="@+id/synthesize" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:text="synthesize" android:textSize="12dp" /> <Button android:id="@+id/play" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:text="play" android:textSize="12dp" /> <Button android:id="@+id/batchSpeak" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:text="批量阅读" android:textSize="12dp" /> <Button android:id="@+id/nextActivity" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:lines="2" android:enabled="false" android:text="备用" android:textSize="12dp" /> </LinearLayout> <EditText android:id="@+id/input" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="input" /> <TextView android:id="@+id/showText" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="10dp" android:background="@android:color/darker_gray" android:minLines="3" android:scrollbars="vertical" /> </LinearLayout>

2、添加ch2005MainActivity.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.OS; using Android.Widget; using Com.Baidu.Tts.Client; using Com.Baidu.Tts.Answer.Auth; namespace MyDemos.SrcDemos { [Activity(Label = "【例20-5】百度tts基本用法")] public class ch2005MainActivity : Activity, ISpeechSynthesizerListener { private EditText mInput; private TextView mShowText; private SpeechSynthesizer mSpeechSynthesizer; /// <summary> /// sd卡上保存百度tts文件的路径 /// </summary> private string mSampleDirPath; private const string SpeechFemaleModelName = "bd_etts_speech_female.dat"; private const string SpeechMaleModelName = "bd_etts_speech_male.dat"; private const string TextModelName = "bd_etts_text.dat"; private const string EnglishSpeechFemaleModelName = "bd_etts_speech_female_en.dat"; private const string EnglishSpeechMaleModelName = "bd_etts_speech_male_en.dat"; private const string EnglishTextModelName = "bd_etts_text_en.dat"; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.ch2005Main); mSampleDirPath = Android.OS.Environment.ExternalStorageDirectory.Path + "/baiduTTS"; Console.WriteLine("mSampleDirPath=" + mSampleDirPath); initialView(); initialTts(); } private void initialTts() { mSpeechSynthesizer = SpeechSynthesizer.Instance; mSpeechSynthesizer.SetContext(this); mSpeechSynthesizer.SetSpeechSynthesizerListener(this); // 文本模型文件路径 (离线引擎使用) mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamTtsTextModelFile, mSampleDirPath + "/" + TextModelName); // 声学模型文件路径 (离线引擎使用) mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamTtsSpeechModelFile, mSampleDirPath + "/" + SpeechFemaleModelName); // 请替换为语音开发者平台上注册应用得到的App ID (离线授权) //mSpeechSynthesizer.SetAppId("your_app_id"); mSpeechSynthesizer.SetAppId(ch.TtsAppID); // 请替换为语音开发者平台注册应用得到的apikey和secretkey (在线授权) //this.mSpeechSynthesizer.SetApiKey("your_api_key", "your_secret_key"); this.mSpeechSynthesizer.SetApiKey(ch.TtsApiKey, ch.TtsSecretKey); // 发音人(在线引擎),可用参数为0,1,2,3。。。(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。) mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamSpeaker, "0"); // 设置Mix模式的合成策略 mSpeechSynthesizer.SetParam(SpeechSynthesizer.ParamMixMode, SpeechSynthesizer.MixModeDefault); // 授权检测接口(可以不使用,只是验证授权是否成功) AuthInfo authInfo = this.mSpeechSynthesizer.Auth(TtsMode.Mix); if (authInfo.IsSuccess) { Console.WriteLine("授权检测--授权成功(auth success)。"); } else { string errorMsg = authInfo.TtsError.DetailMessage; Console.WriteLine("授权检测--授权失败(auth failed),errorMsg=" + errorMsg); } // 初始化tts mSpeechSynthesizer.InitTts(TtsMode.Mix); // 加载离线英文资源(提供离线英文合成功能) int result = mSpeechSynthesizer.LoadEnglishModel( mSampleDirPath + "/" + EnglishTextModelName, mSampleDirPath + "/" + EnglishSpeechFemaleModelName); } private void initialView() { mInput = FindViewById<EditText>(Resource.Id.input); mInput.Text = "今天阳光明媚,风和日丽!"; mShowText = FindViewById<TextView>(Resource.Id.showText); var speak = FindViewById<Button>(Resource.Id.speak); speak.Click += delegate { string text = this.mInput.Text; int result = this.mSpeechSynthesizer.Speak(text); if (result < 0) { System.Diagnostics.Debug.WriteLine("出错了,错误码:{0},请检查百度tts文档中对应错误码的含义。", result); } }; var pause = FindViewById<Button>(Resource.Id.pause); pause.Click += delegate { mSpeechSynthesizer.Pause(); }; var resume = FindViewById<Button>(Resource.Id.resume); resume.Click += delegate { mSpeechSynthesizer.Resume(); }; var stop = FindViewById<Button>(Resource.Id.stop); stop.Click += delegate { mSpeechSynthesizer.Stop(); }; var synthesize = FindViewById<Button>(Resource.Id.synthesize); synthesize.Click += delegate { string text = this.mInput.Text; int result = this.mSpeechSynthesizer.Synthesize(text); if (result < 0) { System.Diagnostics.Debug.WriteLine("error,please look up error code in doc or URL:http://yuyin.baidu.com/docs/tts/122 "); } }; var play = FindViewById<Button>(Resource.Id.play); play.Click += delegate { }; var batchSpeak = FindViewById<Button>(Resource.Id.batchSpeak); batchSpeak.Click += delegate { List<SpeechSynthesizeBag> bags = new List<SpeechSynthesizeBag>(); bags.Add(GetSpeechSynthesizeBag("123456", "0")); bags.Add(GetSpeechSynthesizeBag("你好", "1")); bags.Add(GetSpeechSynthesizeBag("使用百度语音合成SDK", "2")); bags.Add(GetSpeechSynthesizeBag("hello", "3")); bags.Add(GetSpeechSynthesizeBag("这是一个demo工程", "4")); int result = this.mSpeechSynthesizer.BatchSpeak(bags); if (result < 0) { System.Diagnostics.Debug.WriteLine("error({0}),please look up error code in doc or URL:http://yuyin.baidu.com/docs/tts/122 ", result); } }; } protected override void OnDestroy() { base.OnDestroy(); } private SpeechSynthesizeBag GetSpeechSynthesizeBag(string text, string utteranceId) { SpeechSynthesizeBag speechSynthesizeBag = new SpeechSynthesizeBag(); speechSynthesizeBag.SetText(text); speechSynthesizeBag.UtteranceId = utteranceId; return speechSynthesizeBag; } public void OnError(string utteranceId, SpeechError error) { Console.WriteLine("onError error=" + error.Description + "--utteranceId=" + utteranceId); } public void OnSpeechFinish(string utteranceId) { Console.WriteLine("onSpeechFinish utteranceId=" + utteranceId); } public void OnSpeechProgressChanged(string p0, int p1) { //Console.WriteLine("onSpeechProgressChanged"); } public void OnSpeechStart(string utteranceId) { Console.WriteLine("onSpeechStart utteranceId=" + utteranceId); } public void OnSynthesizeDataArrived(string utteranceId, byte[] data, int progress) { Console.WriteLine("onSynthesizeDataArrived"); } public void OnSynthesizeFinish(string utteranceId) { Console.WriteLine("onSpeechFinish utteranceId=" + utteranceId); } public void OnSynthesizeStart(string utteranceId) { Console.WriteLine("onSynthesizeStart utteranceId=" + utteranceId); } } }

时间: 2024-10-25 07:39:05

20.5 语音合成(百度2016年2月29日发布的tts引擎)的相关文章

20.5 语音合成(百度2016年2月29日发布的tts引擎)_Android

一.简介 编写手机App时,有时需要使用文字转语音(Text to Speech)的功能,比如开车时阅读收到的短信.导航语音提示.界面中比较重要的信息通过语音强调.--等. 由于Android自带的Pico TTS并不支持中文,所以要既能阅读中文文本,还能阅读英文文本,必须下载第三方提供的能说中文的语音包. 二.申请百度tts授权 本节以百度2016年2月29日发布的"离在线融合语音合成SDK_Android 2.2.3版"为例说明用C#实现语音合成的基本用法.之所以选择百度语音合成来

诺亚舟今日宣布将于8月29日发布第四财季及全年财报

摘要: 查看最新行情 北京时间8月14日晚间消息, 诺亚舟 (NYSE: NED )今日宣布,将于美国东部时间2013年8月28日美国股市收盘后(北京时间8月29日)发布2013财年第四季度及全年财报. 该财报结果将 查看最新行情 北京时间8月14日晚间消息, 诺亚舟 (NYSE: NED )今日宣布,将于美国东部时间2013年8月28日美国股市收盘后(北京时间8月29日)发布2013财年第四季度及全年财报. 该财报结果将同时发布在诺亚舟网站投资者关系频道 http://ir.noaheduca

消息称苹果将于6月29日发布新一代iPhone和iPad

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 既是向乔布斯致敬,也是为库克领导的苹果祈福(TechWeb配图) [TechWeb报道]3月21日消息,据国外媒体报道,科技网站Gizmorati日前从苹果内部获得消息称,苹果将于6月26日发布新一代iPhone和iPad. 消息人士指出,今年6月29日是iPhone手机六周年纪念日--第一部iPhone于2007年6月29日发布.为了庆祝六

盛大游戏8月29日发布第二财季财报

摘要: 北京时间8月21日晚间消息, 盛大游戏 (Nasdaq: GAME )今日宣布,将于北京/香港时间2013年8月29日发布截至6月30日的2013年第二季度财报. 该财报结果同时将发布在盛大游戏网站投资者关系频 北京时间8月21日晚间消息, 盛大游戏 (Nasdaq: GAME )今日宣布,将于北京/香港时间2013年8月29日发布截至6月30日的2013年第二季度财报. 该财报结果同时将发布在盛大游戏网站投资者关系频道 http://ir.shandagames.com/ 上. 财报发

诺亚舟8月29日发布第四财季及全年财报

摘要: 查看最新行情 北京时间8月14日晚间消息, 诺亚舟 (NYSE: NED )今日宣布,将于美国东部时间2013年8月28日美国股市收盘后(北京时间8月29日)发布2013财年第四季度及全年财报. 该财报结果将  查看最新行情 北京时间8月14日晚间消息, 诺亚舟 (NYSE: NED )今日宣布,将于美国东部时间2013年8月28日美国股市收盘后(北京时间8月29日)发布2013财年第四季度及全年财报. 该财报结果将同时发布在诺亚舟网站投资者关系频道 http://ir.noaheduc

百度将于10月30日发布第三财季财报

摘要: 查看最新行情 北京时间10月14日晚间消息, 百度 (Nasdaq: BIDU )今日宣布,将于2014年10月29日美国股市收盘后(北京时间10月30日)发布截至9月30日的2014年第三季度财报. 财报发布后 ,百度管   查看最新行情 北京时间10月14日晚间消息, 百度 (Nasdaq: BIDU )今日宣布,将于2014年10月29日美国股市收盘后(北京时间10月30日)发布截至9月30日的2014年第三季度财报. 财报发布后 ,百度管理团队将于美国东部时间2014年10月29

百度将于10月30日发布第三季度财报

摘要: 查看最新行情 北京时间10月15日下午消息, 百度 (Nasdaq: BIDU )今天宣布,将于2013年10月29日美股收盘后发布2013财年第三季度财报. 百度管理层将于美国东部时间10月29日晚间8点(北京时间  查看最新行情 北京时间10月15日下午消息, 百度 (Nasdaq: BIDU )今天宣布,将于2013年10月29日美股收盘后发布2013财年第三季度财报. 百度管理层将于美国东部时间10月29日晚间8点(北京时间10月30日上午8点)召开分析师电话会议,解读财报要点,

中芯国际7月29日发布第二季度财报

北京时间7月15日晚间消息,中芯国际(NYSE:SMI)今天宣布,该公司将于美国东部时间7月28日20:30(北京时间7月29日8:30)召开电话会议,讨论2009年第二季度财报. 要收听中芯国际电话会议,美国投资者可拨打免费电话1-617-614-3672和1-800-260-8140 ,香港投资者可拨打电话852-3002-1672,密码都为"SMIC".此次电话会议还将进行网络直播,投资者可以访问中芯国际公司网站http://www.smics.com"投资者关系&qu

百度将于7月24日发布第二季度财报

美国东部时间7月17日6:00(北京时间7月17日18:00)消息,百度(Nasdaq:BIDU)今天宣布,该公司将于美国东部时间7月23日(北京时间7月24日)美国股市收盘后发布截至6月30日的2009年第二季度财报. 财报发布后,百度将于美国东部时间7月23日20:00(北京时间7月24日8:00)召开电话会议.百度管理层将出席电话会议,解读财报要点,并回答分析师和投资者的提问.要收听百度电话会议,美国投资者可拨打电话+1-617-597-5310,英国投资者可拨打电话+44-207-365