开发TTS产品就是个力气活

原创 2006年06月09日 18:01:00

--TTS漫谈

首先声明,我不是语言专家,以下讨论从程序员的角度出发。
TTS就是Text To Speech,文本转语音,文本朗读,差不多是一个意思。在语音系统开发中经常要用到。

目前市场上的TTS很多,实现方式也各式各样,有的很昂贵,如科大讯飞,据说当初得到863计划的资助,有很高的技术;有的相对便宜,如捷通华声, InfoTalk;也有免费的,如微软的TTS产品。

相对于ASR(Automatic Speech Recognition,自动语音识别)来说,实现一个TTS产品所需要的技术难度不算大,在我看来也就是个力气活。

要是让我们来做一个能够把汉语句子朗读出来的TTS,我们会怎么做呢?
有一种最简单的TTS,就是把每个字都念出来,你会问,岂不要录制6千多个汉字的语音?幸运的是,汉语的音节很少,很多同音字。我们最多只是需要录制: 声母数×韵母数×4,(其实不是每个读音都有4声),这样算来,最多只需要录制几百个语音就可以了。
在合成的时候需要一张汉字对应拼音的对照表,汉字拼音输入法也依赖这张表,可以在网上找到,不过通常没有4声音调,大不了自己加上,呵呵,要不怎么说是力气活呢。
这样做出来的TTS效果也还可以,特别是朗读一些没有特别含义的如姓名,家庭住址,股票代码等汉语句子,听起来足够清晰。这要归功于我们伟大的母语通常都是单音节,从古代的时候开始,每个汉字就有一个词,表达一个意思。而且汉字不同于英语,英语里面很多连读,音调节奏变化很大,汉字就简单多了。
当然,你仍然要处理一些细节,比如多音字,把“银行”读成“yin xing”就不对了;再比如,标点符号的处理,数字、字母的处理,这些问题对于写过很多程序的你,当然不难了。
国内的一些语音板卡带的TTS,不管是卖钱的还是免费的,大体都是这样做出来的,也就是这样的效果。

如果要把TTS的效果弄好一点,再来点力气活,把基本的词录制成语音,如常见的两字词,四字成语等,再做个词库和语音库的对照表,每次需要合成时到词库里面找。这样以词为单位,比以字为单位,效果自然是好多了。当然,这里面还是有个技术,就是分词的技术,要把复杂的句子断成合理的词序列,也有点技术。这也要怪新文化那些先驱们,当初倡导白话文,引进西文的横排格式、标点符号的时候,没有引进西文中的空格分词。不过即使分词算法那么不高效,不那么准确,也问题不大,如前面所说,汉字是单音节词,把声音合起来,大体上不会有错。

当然,科大讯飞的力气活又干的多了些,据说已经进化到以常用句子为单位来录音了,大家可以想像,这要耗费更多的力气,换来更好的效果。

至于增加一些衔接处的“词料”,弄一些修饰性的音调,我认为是无关紧要的,对整体的效果改进不是太大。

市面上商品化TTS一般还支持粤语,请个粤语播音员录音,把上面的力气活重做一遍就是了。

再说句题外话,很多人觉得录音最好找电台、电视台的播音员,其实找个你周围的女同事来录制,只要吐字清晰就可以了。在某种情况下,寻常声音比字正腔圆的新闻联播来得可爱。

再来说说文本的标识,对于复杂文本,某些内容程序没有办法处理,需要标识出来。比如,单纯的数字“128”,是应该念成“一百二十八”还是“一二八”?解决办法通常是加入XML标注,如微软的TTS:"<context ID = "number_cardinal">128</context>"念成“一百二十八”,"<context ID = "number_digit">128</context>"将念成“一二八”。TTS引擎可以去解释这些标注。遗憾的是,语音XML标注并没有形成大家都完全认可的标准,基本上是各自一套。

再说说TTS应用编程,微软的TTS编程接口叫SAPI,是COM接口,开发起来还是有点麻烦,还好MSDN的网站上资料很全面。(链接是:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/SAPI51sr/html/Welcome.asp),微软的TTS虽然免费,但其中文角色目前是个男声,声音略嫌混浊,感觉不爽。

国内一般的厂家提供API调用接口,相对比较简单,可以方便地嵌入应用程序中去。
商品化的TTS还有个并发许可限制,就是限制同时合成的并发线程数,我觉得这个限制用处不大。无论哪种TTS,都可以将文本文件转换成语音文件,供语音卡播放。大部分应用句子比较短小,一般不会超过100个汉字,合成的时间是非常短的,弄个线程专门负责合成,其它应用向该线程请求就是了,万一句子很长,把它分解成多个短句子就是了,播放的速度总是比合成的速度慢。
也很多应用是脱机合成,没有实时性要求,就更不必买多个许可了。

更多情况下,我们甚至没有必要购买TTS,比如语音开发中常见的费用催缴,拨通后播放:“尊敬的客户,您本月的费用是:212元”,前面部分对所有客户都一样,录一个语音文件就是了,而数字的合成是很简单的,你只要录制好10个数字语音,再加上十,百,千,万,再加上金钱的单位“元”。

新翼语音TTS开发包

  • 2014年01月30日 22:34
  • 118KB
  • 下载

Android学习笔记(18)————利用tts开发一个android发音字典

/********************************************************************************************  * au...
  • conowen
  • conowen
  • 2012年04月02日 11:47
  • 10733

delphi开发的TTS语音demo

  • 2017年05月09日 09:20
  • 239KB
  • 下载

Android TTS文字转语音开发

之前在做TTS开发的时候能够正常的将文字转为语音,但是今天做了一个小程序,结果却发不了音,仔细测试了一下,发现了一个问题。 首先先讲下TTS如何实现。 1、安装语音库,假如要中文发音,科大讯飞语音3....

使用C#开发TTS应用

使用C#开发TTS功能与NeoSpeech使用问题

Java TTS 语音开发

首先,本人声明本人只懂java,所以不知道具体怎么调用window的语音系统。用C、C++应该都可以,由于项目太急了,具体没去研究。     如果项目中只要读取英文,那倒直接可以用free tts,...

Android TTS 文字转语音开发

前言最近项目中需要实现对特定文字进行语音播放,最开始的想法是将文字转换成语音然后调用MediaPlayer进行播放,但是该方法一是语音包过大导致软件很大,在一个想实现多个语音同时触发却能顺序播放,这两...

iOS开发TTS技术即文本转语音

iOS开发TTS技术即文本转语音iOS系统文本转语音的实现在iOS7之前,想要实现语音播报文字内容,可能需要第三方资源库来实现。现在在iOS之后,系统为我们提供了语音播报文字的功能,我们不仅可以播报英...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开发TTS产品就是个力气活
举报原因:
原因补充:

(最多只允许输入30个字)