Festival:Linux TTS入门及Demo

来源:互联网 发布:怎样安装网络摄像机 编辑:程序博客网 时间:2024/04/29 12:46

翻译:Derry / 2010-7-27

原文:http://www.xenocafe.com/tutorials/php/festival_text_to_speech/index.php

 

前提条件
基于*nix的操作系统
Festival for Linux
PHP 3 or higher
LAME Ain't an MP3 Encoder (optional)

下载源码: festival-tts.tar.gz

 

内容
介绍
使用yum安装Festival RPM
尝试Festival Text-To-Speech功能
使用text2wave将TTS语音保存到磁盘
安装LAME MP3编码器
将WAV-RIFF音频文件转换为MP3格式
为Festival构建PHP前端(text2wave)
PHP TTS演示程序
结论


介绍

本教程将向你展示在Linux下如何使用Festival程序实现“文本-语音(TTS)”合成。Festival是类Unix系统下免费的软件框架,它能够将纯文本转换为听得见的语音输出。可以确信我们几乎都见到过微软Merlin字符(也称为Microsoft Agent),它是微软Office及其他产品的成员之一。我不能确信那就是Merlin字符首次登场的地方,但我可以肯定的是,它的确可以用来当作Office助手。MS代理使用语音合成技术为本地应用提供更好的交互。我个人感觉这没啥用,但的确有人喜欢它(Clippy比我更喜欢,但却没说一句话)。Linux下能够使用Fesitval实现TTS。本文选择的Linux系统是CentOS 4.2,但如果可以编译Festival或者通过RPM加载(或者其他方式),任何类Unix操作系统都是可用的。在本教程里,我将向你展示如下主题:使用yum安装Festival,创建HTML表单来接收用户输入,同时使用PHP处理过程将输入文本使用text2wave程序转换为声音,也可以使用 LAME 把默认的WAV-RIFF文件转换为MP3来压缩文件大小。实际上使用tts能够实现的功能要比我这里介绍的多的多, 所以到实践中去学习,冒险多尝试来创建更多有趣的Linux TTS应用吧(也许可以做个通过cron调用的语音提醒脚本?)。

使用yum安装Festival RPM

本教程中安装的是RPM版而非源码格式的Festival,如果你愿意通过源码安装,也可以在这儿下载. 采用源码安装是更好的选择,原因在于Festival已经发布了1.95(2.0beta)版,而CentOS 4.x RPM的festival-1.4.2-25.i386.rpm版本是1.4.2. 我没试过源码安装,所以只能推测它优化了tts合成引擎,但就本教程来讲,RPM版的已经足够了。如果你不确定电脑上是否安装了Festival,可以使用which或者rpm命令来验证一下。

which festival

[graphical representation of executing 'which festival']

可以看到,没有找到任何Festival信息。这基本上意味着你没有安装,但如果你想尝试rpm,那么试试这个命令:

rpm -qa | grep -i festival

如果Festival RPM没有显示,那说明你没安装。没问题,这里正好用到yum,现在我们就使用yum安装Festival:

yum install festival

[graphical representation of executing 'yum install festival']

yum将会与CentOS文档库通信,解析Festival和你操作系统上可能的依赖项,并提示你下载安装Festival RPM。输入 y 表示同意并按回车。Festival RPM有18M,所以在下载的时候你可能会想站起来伸个懒腰啥的。一旦下载完成,无须手动安装,yum会帮你干这个事儿。好了,完成Festival安装后,下一步我们将使用它,让计算机说话。


尝试Festival Text-To-Speech功能

我们来通过几个例子来看看怎么使用Festival。你最好看看Festival用户手册页面来获取更多的可选项和使用方法。基本上,你只管使用--tts选项传递一个文本字符串给Festival,它就能把文本合成为语音了。同样也可以使用文本文件或者脚本来完成更加动态的音频输出。

例1: 美丽的一天消息(echo 文本)

echo "It's such a beautiful day! Why are you in front of the computer?" | festival --tts

例 2: 今天是几号? (编程输出)

date '+%A, %B %e, %Y' | festival --tts

例 3: 随机日期 (PHP shell 脚本)

./rand.php | festival --tts

#!/usr/bin/php -q<?php// seed srandsrand((double)microtime()*1000000);// what is the random number?echo "The random number for the day is " . rand(1,25);?>

可以看到,给Festival发送文本是有很多种方式的。如果你花时间看了Festival 用户手册页面 ,也许会注意到并没有保存音频输出为文件的选项。你将不能像把文本导出文件一样把音频输出也导出文件,那该怎么办呢?在Festival包中有个程序叫做text2wave,它能够把音频以WAV格式保存为磁盘文件。


使用text2wave将Text-To-Speech音频保存到磁盘

text2wave读取文本文件内容,将之转换为音频语音,并保存为ulaw,snd, aiff, riff, 或 nist 格式的音频文件。 text2wave的默认音频格式为riff(或WAV,在Windows上很常见)。通过查看text2wave帮助(text2wave --help)可以看到相对Festival来说,它的选项就少多了,但至少你可以以echo,程序或者shell脚本来向它传送文本。其中一个有用的选项是 -scale 用来做音量调节。默认的语音音量有些低,所以需要使用一个浮点值来提升它(50就足够了)。

还是用上面那个例子,这里为每个例子创建一个WAV文件:

echo "It's such a beautiful day! Why are you in front of the computer?" | text2wave -scale 50 -o beautiful_day.wav

date '+%A, %B %e, %Y' | text2wave -scale 50 -o date.wav

./rand.php | text2wave -scale 50 -o rand.wav

如果输入的文本过大,那么输出的WAV文件也会很大。可以尝试使用其他text2wave支持的音频格式或者使用LAME把WAV压缩转换为MP3。下面我们就安装LAME MP3 编码器。


安装LAME MP3编码器

在安装LAME之前要确保你系统上已经安装了gcc等开发工具。如果没安装这些工具和一些依赖项,也可以使用yum(yum install gcc)来安装。也可能有些软件包没有列出来,你也要逐个找出来。Lame 3.97beta2 是以源码形式提供的。(从sourceforge获取),也有RPM包可用,但本文我们将编译源码创建二进制文件。确认你一root用户登录并定位置home目录,使用wget下载源码包,解压gzip压缩后的tar包,cd到解压后的lame-2.97目录,运行configure脚本,make,然后安装二进制文件。

su -
[enter root password]
cd ~
wget http://easynews.dl.sourceforge.net/sourceforge/lame/lame-3.97b2.tar.gz
tar zxvf lame-3.97b2.tar.gz
cd lame-3.97
./configure --prefix=/usr
make
make install

如果编译没有问题,从命令行运行LAME (lame)会有如下提示:

[graphical representation of execuing 'lame']

使用LAME我们可以把大个头的WAV文件转换为体积更小巧的MP3版本。


将WAV-RIFF音频文件转换为MP3格式

使用LAME相当简易。你需要做的只是把WAV文件名传给它,设置一个MP3输出的文件名就行了。这儿我就不多介绍LAME的选项了,想看的话可以查看其手册(man lame)。现在我们把前面三个例子生成的文件转换为MP3格式:

lame beautiful_day.wav beautiful_day.mp3
lame date.wav date.mp3
lame rand.wav rand.mp3

现在我们来比较一下WAV和MP3版本,文件大小差异很大,MP3的确是更好的选择。

cd ~
ls -la *.wav
ls -la *.mp3

[graphical representation of executing 'cd ~', 'ls -la *.wav', 'ls -la *.mp3']

为了强调一下迄今为止我们所学的内容,这里将创建一个PHP前端,这样的话你就可以在浏览器上创建tts文件了。


为Festival构建PHP前端(text2wave)

我们将通过创建HTML表单的方式来构建PHP前端处理tts。这个表单包括一个textarea(用来保存转换语音的文本),文本输入框(调节音量值)以及一个复选框(用来标识是否把WAV格式转换为MP3文件)。我在里面加了很多注释说明每块代码的用途,所以这儿就不再赘述了。你只需知道在文本框里输入一些文字,调整音量设置,然后选择是否转换为MP3就行了。一旦你点击了Text-To-Speech按钮,表单将回发到服务器,表单上的数据将会被捕获和处理。表单文本会被写入到一个临时文件,输入到 text2wave 来转换,text2wave会被PHP的exec函数调用。如果MP3选项被选中,第二个 exec 被调用,使用LAME完成WAV至MP3的转换。当页面重新加载后,在提交按钮旁边多出一个连接到音频文件的超链接。可以点击播放,或者右键单击选择“目标另存为”来下载这个文件。

<?php// define the temporary directory// and where audio files will be written to after conversion$tmpdir = "/tmp";$audiodir = "/change/to/your/path";// if the Text-To-Speech button was click, process the dataif (isset($_POST["make_audio"])) {  $speech = stripslashes(trim($_POST["speech"]));  $speech = substr($speech, 0, 1024);  $volume_scale = intval($_POST["volume_scale"]);  if ($volume_scale <= 0) { $volume_scale = 1; }  if ($volume_scale > 100) { $volume_scale = 100; }  if (intval($_POST["save_mp3"]) == 1) { $save_mp3 = true; }  // continue only if some text was entered for conversion  if ($speech != "") {    // current date (year, month, day, hours, mins, secs)    $currentdate = date("ymdhis",time());    // get micro seconds (discard seconds)    list($usecs,$secs) = microtime();    // unique file name    $filename = "{$currentdate}{$usecs}";    // other file names    $speech_file = "{$tmpdir}/{$filename}";    $wave_file = "{$audiodir}/{$filename}.wav";    $mp3_file  = "{$audiodir}/{$filename}.mp3";    // open the temp file for writing    $fh = fopen($speech_file, "w+");    if ($fh) {      fwrite($fh, $speech);      fclose($fh);    }    // if the speech file exists, use text2wave    if (file_exists($speech_file)) {      // create the text2wave command and execute it      $text2wave_cmd = sprintf("text2wave -o %s -scale %d %s",$wave_file,$volume_scale,$speech_file);      exec($text2wave_cmd);      // create an MP3 version?      if ($save_mp3) {        // create the lame command and execute it        $lame_cmd = sprintf("lame %s %s",$wave_file,$mp3_file);        exec($lame_cmd);        // delete the WAV file to conserve space        unlink($wave_file);      }            // delete the temp speech file      unlink($speech_file);      // which file name and type to use? WAV or MP3      $listen_file = (($save_mp3 == true) ? basename($mp3_file) : basename($wave_file));      $file_type = (($save_mp3 == true) ? "MP3" : "WAV");      // show audio file link      $show_audio = true;    }  }} else {  // default values  $speech = "Hello there!";  $volume_scale = 50;  $save_mp3 = true;}?><html><head><title>Festival: Linux Text-To-Speech Demo</title><style type="text/css"><!--body { background-color:#ffffff; font-family:Arial, Helvetica, sans-serif; font-size:10pt; color: #000000; }h1 { font-family:Arial, Helvetica, sans-serif; font-size:18pt; color: #000000; }.tblfont { font-family:Arial, Helvetica, sans-serif; font-size:10pt; color: #000000; }--></style></head><body><h1>Linux Festival Text-To-Speech Demo</h1><form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">  <table width="400" border="0" cellspacing="5" cellpadding="0" class="tblfont">    <tr>       <td colspan="2"><textarea name="speech" wrap="VIRTUAL" style="width:350px;height:100px;"><?php echo $speech; ?></textarea></td>    </tr>    <tr>       <td width="135">Volume Scale         <input name="volume_scale" type="text" size="3" maxlength="3" value="<?php echo $volume_scale; ?>">       </td>      <td width="265">Save as MP3         <input name="save_mp3" type="checkbox" value="1"<?php if ($save_mp3 == 1) { echo " checked"; } ?>>       </td>    </tr>    <tr>       <td><input name="make_audio" type="submit" value="Text-To-Speech"></td>      <td>         <?php if ($show_audio) { ?>        <a href="audio/<?php echo $listen_file; ?>">Listen to the <?php echo $file_type; ?> file</a>         <?php } ?>      </td>    </tr>  </table></form></body></html>

 

结论

就这些了,现在你有了在linux上使用Festival创建tts音频文件的工具。使用tts合成技术你可以创造各种各样的应用程序,例如提醒服务(通过向电话或Email发送音频流)。Festival是个伟大的工具,但是有时候也会很难听清楚语音的意思。对于某些特定的词语它处理起来是有些问题,这对于商业应用来讲显得不是那么完美。再来看看 AT&T 实验室自然语音 Text-to-Speech 引擎 ,试试它们的 demo咋样,它拥有商业级品质,听起来真的很不错,唯一不同的地方就是它是收费的。

原创粉丝点击