杂谈TTS(Text to speech):文本转语音
其实,最早接触,或者说就应该知道TTS应该是两年前。
那时候Chris去了家喻户晓的一家公司,那个步步高点读机哪里不会点哪里工作了一段时间,当时,接触到了内容制作方面的知识,而且亲自制作了几本英文教材书的内容。当时没有现在这样喜欢总结,所以,流于做事而做事,没有太多自己搭起来的知识框架,比较乱(虽然现在也没有知识框架也很乱,哈哈哈)
第一次听到TTS应该是在今年4月份的时候。
去了去哪儿,公司的交易平台TTS(Total solution)就是这个名字。说这个名字,估计大家还是蒙圈,整体解决方案?是什么意思?
了解过的童鞋都知道,去哪儿是最大的中文旅游搜索平台,顾名思义,要为用户提供价格比较,让用户选择最便宜、最便捷、最安全的服务和产品。那么一个重要的问题来了,全国各地有那么多酒店、机票、旅游产品代理商、官方旗舰店,如果都跟去哪儿合作的话,用户在去哪儿上面比较了价格,点击购买,一定要保证用户体验达到最佳,优化购买流程,保障其中的安全性和便捷性。于是,交易平台TTS(Total solution)整体解决方案这个系统就出来了,统一了所有第三方平台的管理,这个平台也加强了去哪儿对各大代理商的控制权。
说去哪儿这段,只是想告诉大家一个事实:很多事情,我们都知道,但是,没有上升到理论层次,或者说没有搭建自己的知识框架,所以,当说出tts的时候,就懵逼了,其实背后的事情,你是知道的。(其实,我也是后来才知道,所以,努力吧,骚年们~)
言归正传。
今天说的TTS是text to speech,从文本到语言,文本转语音,文本朗读,差不多是一个意思。在语音系统开发中经常要用到。
记得有一次,我打了一辆Uber,在车里,相信大家都听到过一句:“百度地图将持续为您导航”。当时,我就傻叉似的问了同行的伙伴,这个说话的女声,是专门找人录制的吗?(作为在百度待过的,感觉羞辱万分)。
先说tts的用途,让大家有点概念。
这里,又要涉及两个个概念:CTI和IVR。
CTI技术从计算机通信集成(Computer Telephony Integration)发展而来,最初是想将计算机技术应用到电话系统中,能够自动地对电话中的信令信息进行识别处理,并通过建立有关的话路连接,而向用户传送预定的录音文件、转接来话等。而到现在,CTI技术已经发展成“计算机电信集成”技术(Computer Telecommunication Integration),即其中的“T”已经发展成“Telecommunication”,这意味着目前的CTI技术不仅要处理传统的电话语音,而且要处理包括传真、电子邮件等其它形式的信息媒体。
在CTI技术中扮演重要角色的就是IVR技术。
IVR(Interactive Voice Response),互动式语音应答。这个概念会让大家对tts豁然开朗。
IVR:只须用电话即可进入服务中心,可以根据操作提示收听手机娱乐产品,也可以根据用户输入的内容播放有关的信息。最常见的业务有:语音点歌、语音聊天交友、客服中心。IVR另一重要应用是在呼叫中心中,分为前置和后置,前置IVR是语音先进入IVR处理,在无法解决客户问题的情况下才转入人工座席。后置IVR是指IVR与人工座席处在平衡的位置,人工无法满足客户入话时转IVR,主要是为了拖延时间或增值服务。
刚刚说的IVR也就是tts的一个代表性用途。
目前市场上的TTS很多,实现方式也各式各样,有的很昂贵,如科大讯飞,据说当初得到863计划的资助,有很高的技术;有的相对便宜,如捷通华声, InfoTalk;也有免费的,如微软的TTS产品。
这里贴一张TTS技术路线图:
图中划分出了三个部分:数据支持、TTS内核、外部应用。
数据支持部分包括:语法知识库、语音语料库、语法词典。这里,今天我跟师傅沟通了一下,然后看了我们公司的语料库后台,明白了,数据支持部分就是通过自然抓取和人工录入的方式,将需要发音的文字准备好。
外部使用自然就是用户客户端请求之后的响应了。
重点是TTS内核的三个部分:
文本分析: 对输入文本进行语言学分析,逐句进行词汇的、语法的和语义的分析,以确定句子的低层结构和每个字的音素的组成,包括文本的断句、字词切分、多音字的处理、数字的处理、缩略语的处理等。
语音合成: 把处理好的文本所对应的单字或短语从语音合成库中提取,把语言学描述转化成言语波形。
韵律生成: 是指语音合成系统所输出的语音的质量,一般从清晰度(或可懂度)、自然度和连贯性等方面进行主观评价。清晰度是正确听辨有意义词语的百分率;自然度用来评价合成语音音质是否接近人说话的声音,合成词语的语调是否自然; 连贯性用来评价合成语句是否流畅。
要合成出高质量的语音,所采用的算法是极为复杂的,因此对机器的要求也非常高。算法的复杂度决定了目前微机并发进行多通道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的网站上资料很全面。微软的TTS虽然免费,但其中文角色目前是个男声,声音略嫌混浊,感觉不爽。
国内一般的厂家提供API调用接口,相对比较简单,可以方便地嵌入应用程序中去。
商品化的TTS还有个并发许可限制,就是限制同时合成的并发线程数,我觉得这个限制用处不大。无论哪种TTS,都可以将文本文件转换成语音文件,供语音卡播放。大部分应用句子比较短小,一般不会超过100个汉字,合成的时间是非常短的,弄个线程专门负责合成,其它应用向该线程请求就是了,万一句子很长,把它分解成多个短句子就是了,播放的速度总是比合成的速度慢。
也很多应用是脱机合成,没有实时性要求,就更不必买多个许可了。
更多情况下,我们甚至没有必要购买TTS,比如语音开发中常见的费用催缴,拨通后播放:“尊敬的客户,您本月的费用是:212元”,前面部分对所有客户都一样,录一个语音文件就是了,而数字的合成是很简单的,你只要录制好10个数字语音,再加上十,百,千,万,再加上金钱的单位“元”。
本文由 @Chris 原创发布于人人都是产品经理 ,未经许可,禁止转载。