首页 > 其他分享 >android tts语音使用的一些资料(转)

android tts语音使用的一些资料(转)

时间:2023-07-04 21:32:33浏览次数:31  
标签:Engine TextToSpeech 要领 tts mTts TTS 语音 android


  TextToSpeech简称 TTS,是Android 1.6版本中比较首要 的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者使用 程序中,增强用户体验。 
   在讲解TTS API和将这项功能使用 到你的实际项目中的要领 之前,先对这套TTS引擎有个初步的明白 。 
对TTS资源的大体明白 : 
   TTS engine依托于当前Android Platform所支持的几种首要 的语言:English、French、German、Italian和Spanish五大语言(暂时没有咱们 伟大的中文,至少Google的科学家们还没有把中文玩到炉火纯青的地步,先易后难也是理所当然。)TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于English,在TTS中可以分别输出美式和英式两种不同的版本(由此看出Google的做事风格真够细致,而正因为如此估计Google不参加 中文的另外一种理由是中文的方言太多了)。 
能支持如此庞大的数据量,TTS 引擎对于资源的优化采取预加载的要领 。根据一系列的参数信息(参数的用法将在后边有细致 的推荐 )从库中提取相应的资源,并加载到当前系统中。 
   尽管当前大部分加载有Android操作系统的装备 都通过这套引擎来提供TTS功能,但由于一些装备 的存储空间特别 有限而影响到TTS无法 最大限度的发挥功能,算是当前的一个瓶颈。为此,开发小组引入了检测模块,让运用 这项技能 的使用 程序或者游戏针对于不同的装备 可以有相应的优化调整,从而防止 由于此项功能的限定 ,影响到整个使用 程序的运用 。比较稳妥的做法是让用户自行挑选 能无法 有足够的空间或者需求来加载此项资源,下边给出一个规则 的检测要领 :

 

Intent checkIntent = new Intent();          checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA;  startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

 

    假如 当前系统准许 建立 一个 “android.speech.tts.TextToSpeech” 的Object, 说明已经提供TTS功能的支持,将检测返回结果中给出“CHECK_VOICE_DATA_PASS” 的标记。假如 系统不支持这项功能,那么用户可以挑选 能无法 加载这项功能,从而让装备 支持输出多国语言的语音功能“Multi-lingual Talking”。“ACTION_INSTALL_TTS_DATA” intent将用户引入Android market中的TTS下载界面。下载完成后将自动完成安装,下边是实现这一流程 的完整代码 (androidres.com) :

 

 private TextToSpeech mTts;

protected void onActivityResult( int requestCode, int resultCode, Intent data) {
 if (requestCode == MY_DATA_CHECK_CODE) { 
       if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){ 
// success, create the TTS instance
 mTts = new TextToSpeech(this, this);
        } else 
{ // missing data, install it 
Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
 startActivity(installIntent); 
}
 } 
}

 

TextToSpeech实体和OnInitListener都须要 引用当前Activity的Context作为构造参数。OnInitListener()的用处是通知系统当前TTS Engine已经加载完成,并处于可用状态。 

根据需求配置 语言参数: 

早在Google I/O大会上,官方给出了一段关于使用 这项功能的鲜活体验,将翻译结果直接通过五种不同国家语言的语音输出。加载语言的要领 特别 基本 :

mTts.setLanguage(Locale.US);

上边代码示意 当前TTS实体加载美式英语。其参数并没有指示某种语言的名称,而是运用 国家代码来示意 ,这样做的优点 是不但可以确定语言的挑选 ,而且可以根据地区的不同而有所区别。例如:英语作为最广泛被使用 的语种,在多个不同的地区都有一定的差别。判断当前系统能无法 支持某个地区的语言资源,可以通过调用isLanguageAvailable()要领 的返回值,根据返回值的描述来挑选 正确的处理方式。让使用 某些绚丽功能的使用 程序更加健壮,这个是贯穿整个开发流程 都要思虑 的技能 环节。下边是一些使用 实例 (androidres.com) :

mTts.isLanguageAvailable(Locale.UK)) mTts.isLanguageAvailable(Locale.FRANCE)) mTts.isLanguageAvailable(new Locale("spa", "ESP")))

假如 返回值是 “TextToSpeech.LANG_COUNTRY_AVAILABLE” 说明所挑选 的地区被包含在当前TTS系统中。假如 系统中已经建立 了TTS实体,那么可以运用 isLanguageAvailable()要领 来替代 Start“ACTION_CHECK_TTS_DATA” intent 检测。当无法 找到任何可用资源匹配所指定的参数时,将会返回 “TextToSpeech.LANG_MISSING_DATA”的结果。下边给出另外两个返回其它不同状态信息的例子:

mTts.isLanguageAvailable(Locale.CANADA_FRENCH)) mTts.isLanguageAvailable(new Locale("spa")) 

两个语句的返回值均为 “TextToSpeech.LANG_AVAILABLE” 。第一个是检测当前系统能无法 支持加拿大法语,由于系统在资源库中无法 找到这个地区的法语分支,其意思 是仅支持这项语言(法语),而不支持当前地区的语言分支。 

另外,相比于上面强制用户使用 预定的语音配置 ,更加提倡运用 Locale.getDefault()要领 根据用户默认的地区配置 来挑选 合适的语言库。 

执行Speak的详细 要领 : 

根据上边的推荐 ,基本实现了TextToSpeech的原始 化和参数配置。下面是一个相关 闹钟的使用 实例,运用 Speak()要领 可以直接在使用 程序中发挥强悍 的语音功能。没错,用起来就是这么基本 :

 

String myText1 = "This Translation is from androidRes.com"; String myText2 = "I hope so, because it's time to wake up."; mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null); mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);


TTS Engine的工作原理: 
每个独立的使用 程序都可以单独建立 一个TTS实体,而他们须要 执行的语音消息列队(Queue)都统一由TTS Engine维护 和语音合成。

名词解释: 
synthesize[?s?nθ?sa?z]DJ['s?nθ??sa?z]KK:to produce sounds, music or speech using electronic equipment (音响)合成 
utterances[??t?r?ns] DJ [??t?r?ns] KK:说话方式,语音/语调。

每个独立的TTS实例维护 语音消息列队请求的优先级和顺序等。当引用 “TextToSpeech.QUEUE_FLUSH” 调用Speak()要领 时,会中断当前实例正在运行的任务(也可以理会 为清理 当前语音任务,转而执行新的列队任务)。引用 “TextToSpeech.QUEUE_ADD”标签的发音任务将被添加到当前任务列队之后。 

为语音任务关联Stream Type: 

在Android操作系统中所有的Audio Stream任务都是通过AudioManager类来实现,而它会针对不同的Stream Type来改动 语音的播放模式。StreamType可以理会 为语音的播放属性,这个属性是用户根据自己的须要 在系统中配置的使用 方案。假如 将语音任务都清楚的分门别类,可以方便的统一维护 相同类别任务的属性。基于上一个Alarm Clock例子的基础上,将Speak()要领 的结尾 一个Null参数替换成具有实际意思 的数值。这个参数的类型是HashMap,假如 期盼 将当前的Stream Type配置 为系统中Alarm类型,对上一个例子稍作改动:

HashMap myHashAlarm = new HashMap(); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm); mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);

使用 语音功能的Completion Callback: 

TTS中的Speak()的是异步调用,无论使用 QUEUE_FLUSH或者QUEUE_ADD作为参数都可以通过定义Listener监听当前任务的完成状态。可以运用 这个要领 追加Speak()执行之后的一些额外操作。下接下来的例子中,当完成第二次Speak()要领 调用之后,运用 OnUtteranceCompletedListener接口来调用其它要领 :

 

mTts.setOnUtteranceCompletedListener(this); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "end of wakeup message ID"); // myHashAlarm now contains two optional parameters mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm); 
下边是定义Listener的代码,类似与监听按钮或者其它View Events的要领 。在这里将会把Speak()中HashMap参数传进Listener中,作为条件的判断依据:
public void onUtteranceCompleted(String uttId) { if (uttId == "end of wakeup message ID") { playAnnoyingMusic(); } }


“烘焙”当前实时的语音数据: 
看到烘焙两个字,就会让**想到香喷喷的面包。软件开发要重视 于能无法 可以最大限度的实现资源的复用,特别是针对资源有限的手机使用 平台。那么对于TTS这么奢侈的使用 如何 才能更高效的运用 资源呢?这次一起来体验比烘焙面包更加让人激动的功能,将TTS Engine输出的Audio Stream作为长久 的音频文件保存在当前的存储空间中(SDCard)。这样可以对须要 重复播放的某些语音内容实现高速 的回放功能,从而实现国际倡导的“减排”目的,能省就省吧!在下边的例子用通过TTS的synthesizeToFile要领 ,将合成的语音Stream保存在参数所指定的地址中。
HashMap myHashRender = new HashMap(); String wakeUpText = "Are you up yet?"; String destFileName = "/sdcard/myAppCache/wakeUp.wav"; myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText); mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName); 
当完成以上操作之后会收到系统的完成通知,同时可以像其它音频资源一样,通过android.media.MediaPlayer要领 来播放。但这有悖于TextToSpeech的使用 流程,可以将刚刚输出的语音资源通过addSpeech()的要领 将其语音和文字描述一同存储于TTS库中。
mTts.addSpeech(wakeUpText, destFileName); 
在当前的TTS Instance中,任何运用 Speak()要领 执行相同内容的调用都将复用刚刚所生成的音频文件。假如 资源丢失或者SDCard等存储装备 移除,那么系统将再次通过TTS Engine合成所指定的语音内容。

 

mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm); 
回收TTS: 
当确定使用 程序不再须要 TTS的相关 功能后,可以在Activity的OnDestroy()要领 中调用shutDown()释放当前TTS实体所占用的资源。 
杂谈: 
想必在你的脑袋中已经冒出好多可以很好运用 这个功能的Idea!那么现在就停止想象,开始付诸于行动吧!无论是给手机用户带来方便,或是提高 游戏体验等。Let’s move! 
查看原文:Android官方Blog 

 


 

 

 

标签:Engine,TextToSpeech,要领,tts,mTts,TTS,语音,android
From: https://blog.51cto.com/u_16034393/6625793

相关文章

  • android 音标的抓取 腾讯在线词典API
       DICT.CN的webAPI已经close了,本想好,调用下接口把读音给抓下来。幸好,网上还是有好多的资源可以用的。昨天回去的时候,做了一个QQ的word抓音标的例子,还是大公司好,虽然非常的BS腾讯这狗抄袭人家的创意甚至是产品。 下面是几个开发的API测试了了是用于用的,但是你的程序中,文件......
  • android 基于ListView和CheckBox实现多选和全选记录的功能(转)
    [原]基于ListView和CheckBox实现多选和全选记录的功能应用开发中经常会有从数据库中读取数据显示,然后选中多条、全部记录并且删除的需求。在做定制系统联系人的时候也遇到这样的需求,下面写个简单的通过ListView和CheckBox实现多选、全选的例子。下面是具体的代码,有问题请留言。代......
  • Android 4.0 SDK的离线方式安装
     昨天看新闻得知新版本的android系统发布了,android4.0是人们期盼多时的版本了。作为一个IT技术人员,迫不及待地就奔向了http://developer.android.com去看看有没有新的SDK公布出来,当时是上午,没见到有更新,心想一定是若干天后才会发布。没想到同事下午告诉我,新版的SDK已经发布了。......
  • Android 原生混合flutte运行:Could not resolve io.flutter。
    Android原生项目混合开发flutter,在运行新项目的时候报错。>Couldnotresolveio.flutter:flutter_embedding_debug:1.0.0-2a3401c9bbb5a9a9aec74d4f735d18a9dd3ebf2d. 解决方案添加   url"https://storage.flutter-io.cn/download.flutter.io"repositories{......
  • 如何用Airtest脚本无线连接Android设备?
    1.前言之前我们已经详细介绍过如何用AirtestIDE无线连接Android设备:手把手教你用AirtestIDE无线连接手机!,它的关键点在于,需要先adbconnect一次,才能点击connect按钮无线连接上该设备:但是有很多同学,在使用纯Airtest脚本的形式连接无线设备时,还是遇到了一些困难。今天我们......
  • 语音房源码搭建技术分享之降噪功能详解
     噪音是指人们感觉到不愉快或干扰的声音,它通常是由于各种来源产生的不规则、杂乱的声音信号,噪音在我们生活中有很多的来源,像是环境噪音、社会噪音等,如果长时间暴露在噪音环境中可能导致许多健康问题,包括听力受损、睡眠障碍、心理压力增加、集中注意力困难等,而我今天要分享的知识......
  • Android各组件/控件间通信利器之EventBus
    来源:https://www.cnblogs.com/lwbqqyumidi/p/4041455.html一、build.gradle中dependencies节增加配置api'org.greenrobot:eventbus:3.0.0'二、注册EventBus,一般放到onCreate里面,代码:EventBus.getDefault().register(this);三、注册与解绑一般都是成对出现,代码:/***解绑Ev......
  • Android开发_开启子线程执行耗时操作
    Activityactivity=(Activity)getContext();newThread(newRunnable(){@Overridepublicvoidrun(){activity.runOnUiThread(newRunnable(){@Overridepublicvoidrun(){//在这执行耗时操作......
  • Android:倒计时、定时器、定时执行次数使用笔记
    原文:https://blog.csdn.net/weixin_40420578/article/details/103876900一.倒计时(3、2、1)CountDownTimer() //一共3秒,每隔1秒执行一次 CountDownTimertimer=newCountDownTimer(3000,1000){ @Override publicvoidonTick(longmillisUntilFi......
  • 分享6款文字语音生成驱动虚拟数字人说话的开源项目
    一、FACEGOOD的Audio2Facegithub地址:github.com/FACEGOOD/FA…FACEGOOD对输入和输出数据做了相应的调整,声音数据对应的标签不再是模型动画的点云数据而是模型动画的blendshape权重。FACEGOOD主要完成Audio2Face部分,ASR、TTS由思必驰智能机器人完成。如果你想用自己的......