LinuxTOY 是一个致力于提供 Linux 相关资讯的专题站点。如果您发现了好用好玩的 Linux 东东并愿意发扬自由、分享的精神,可以点击顶部导航 Contact 按钮进行投稿。

Related entries

Ubuntu 之玩转语音合成(Festival)

也许已经有一部分人早就知道 Festival 这个语音合成软件,也就是所谓的 TTS (text to speech)。不过网上相关的安装资料大同小异,基本上是在 Gentoo 上安装的心得。我发现 Ubuntu 只有 Festival,而没有相关的 speechd 软件。我经过一晚上的探索,终于可以把这个 Festival 玩转起来,而且有了一些比较好的效果,下面共享自己的经验出来。

  1. 安装 基本上 Ubuntu 的库里就有 Festival 软件。 $sudo apt-get install festival
  2. 使用 Festival 的基本用法:
    • 交互模式: 直接输入 festival 进入它的命令行界面。 $festival festival 〉 (SayText ” hello , festival is coming “) festival 〉 (tts myfile) 第二行是读取 myfile 文件里的内容。
    • 命令行模式: $festival –tts myfile 直接读取 myfile 里的内容。 $ echo “hello , festival is coming ” | festival –tts 读取字符串。
  3. 配置 Festival 默认用的是 oss,在一些系统会独占音频。这里我们将配置成使用 alsa 发音。 新建文件 ~/.festivalrc , 输入以下内容: (Parameter.set ‘Audio_Command “aplay -q -c 1 -t raw -f s16 -r $SR $FILE”) (Parameter.set ‘Audio_Method ‘Audio_Command) 如果想提高音量,可添加: (set! default_after_synth_hooks (list (lambda (utt) (utt.wave.rescale utt 1.6 t)))) 至此 festival 应该比较好的工作了。在集成声卡中会出现音速过快的问题。LinuxSir 上有一篇关于 Festival 的帖子,其中 wguzgg 网友曾经把网上的方法贴了出来。 我找到了如何将语速恢复正常的方法,原文在这里。 主要是集成在主板上的声卡会出现语速过快的问题,解决方式是: 在 /usr/lib/festival/ 目录下创建一个文件 siteinit.scm,内容如下: (Parameter.set ‘Audio_Method ‘Audio_Command) (Parameter.set ‘Audio_Command “sox -t raw -sw -r $SR $FILE -c2 -t ossdsp /dev/dsp”) 这个参数写在 ~/.festivalrc 上也是有效的。不过就和前面我设置用 alsa 发音的设置冲突了。那个 alsa 的设置好像也能把语速减慢一点吧。我这里提供方法。你自己看着选择了。
  4. 安装新语音 这部分才是我写此文章的重要目的。因为在 Gentoo 的帖子,安装一个新的女声,只需要 emerge mbrola。而在 Ubuntu 的库中并没有收录此包。(也许是我不知道,谁知道告诉我)另一个原因是,默认的美国男声似乎有些含糊不清。所以我找了 mbrola 的女声来安装(注意,不得用于商业用途,他说的)。 手动安装 festival mbrola 的信息,原网页
    • 安装 festival voice wrapper (这个咋翻译偶拿不准) 下载 festvox_us1.tar.gz,把它解压到 festival 的安装目录下,Ubuntu 下为 /usr/share/festival。
    • 获取 MBROLA 声音文件和它的执行文件 跳到 http://tcts.fpms.ac.be/synthesis/mbrola.html ,点击 download,下载 MBROLA binary 和你需要的声音文件。这里选择美国英语女声(for us1)。 安装 MBROLA binary,这里你应该下载到一个名为 mbr301h.zip 的文件。解压后把其中名为 mbrola-linux-i386 的文件改名为 mbrola,再复制到 /usr/local/bin 目录中。 安装声音文件,这里你下载到的声音文件的文件名应该类似 us1-980512.zip,把它解压到 [festival_install_dir]/festival/lib/voices/english/us1_mbrola [festival_install_dir]为 festival 的安装目录。在 Ubuntu 下应为 /usr/share/festival。
  5. 测试新的声音 在执行完上面步骤后新的美国英语女声应该安装完毕。进入 festival 命令行测试一下: festival) (voice_us1_mbrola) festival) (SayText ” hello , american english female voice is coming”) 在这里你应该听到优美的美国英语女声了吧。
  6. 更换默认声音 如果想把上面的女声变成默认的声音,请在 ~/.festivalrc 文件中添加: (set! voice_default ‘voice_us1_mbrola) 到这里比较完美了吧。
  7. 其它玩法 当然你会因为一时好奇而装它。不过过一会之后就会想它会有什么用呢?我这里提供自己的一些玩法。
    • 集成词典发音 在我之前的 vim 技巧中有提到过 sdcv 这个词典翻译软件。它是星际译王的命令行版本。自从有了它之后我就再也没有打开过星际译王了。因为有需要就直接 sdcv “word” 就行了。当然默认它是没有将单词的读音读出来的。星际译王也有个 100 多 M 的语音库,但那个库是一个单词一个文件。只能读库里有语音文件的单词。所以我们可以写个脚本,让 sdcv 和 festival 绑定,这样学习英语来不是更形象嘛。 $cat dict #!/bin/sh echo “$1 ” |festival –tts >/dev/null 2>&1 & sdcv -n $1 使用 dict 代替 sdcv,查询的单词无论怎样都会有读音。爽吧!
    • 读中文 你在开玩笑吧。是的,基本上是个玩笑。中文语音合成国内 863 好象有项目。不过似乎没有给公共平台提供什么软件接口。这里你可以让 festival 读中文拼音,有外国人读中文的味道。(linuxsir上的网友发现的) $echo “ni hao, huan yin lai dao linux” |festival –tts
    • 读文章 用它来读英文文章。但我想,对于我这程度,大概会把我逼疯。

当然如果你还有什么好的主意,欢迎告诉我。

后记:以上内容部分参考 Gengoo 里的 HOWTO,对于转贴我很欢迎,但希望能保留原始出处。上面提到的下载 mbrola 文件的网站我用代理才能上。为免大家下载麻烦,我把下载的三个文件打好包了。

(撰文/lerosua

署名 • 注明出处 • 非商业性使用

8 Comments

  1. 1 yohu Commented @ 2007-01-22 3:13 pmReply to this comment

    这个是蛮好玩的,不过我运行这个 echo "hello , festival is coming " | festival –tts 的时候它怎么提示我 festival: Unknown option "-tts" 这是怎么回事?

  2. 2 lerosua Commented @ 2007-01-22 6:41 pmReply to this comment

    选项问题。应该是打的时候漏了。事实上是 --tts, 是两个 " - " ,html代码容易漏掉!

  3. 3 Daniel Commented @ 2007-01-24 11:26 amReply to this comment

    为啥我运行(SayText ” hello , festival is coming “) 会出现Linux: can't open /dev/dsp # 我机器上其他都有声音的。

  4. 4 lerosua Commented @ 2007-01-24 2:14 pmReply to this comment

    daniel,你可以先把其它声音关掉。看看单独运行会不会发声。基本上你的问题是因为oss独占音频的原因。 我帖子上面有说设置使用alsa发声可以解决这个问题。 新建文件 ~/.festivalrc , 输入以下内容:

    (Parameter.set ‘AudioCommand “aplay -q -c 1 -t raw -f s16 -r $SR $FILE”) (Parameter.set ‘AudioMethod ‘Audio_Command)

    这里用的是alsa,如果你是想用其它声音系统的话得自己探索了。

  5. 5 Daniel Commented @ 2007-01-24 4:50 pmReply to this comment

    lerosua 我按照这方法是了可是在终端输入festival出现一下内容 SIOD ERROR: unbound variable : ‘Audio_Command closing a file left open: /home/daniel/.festivalrc closing a file left open: /usr/share/festival/init.scm festival: fatal error exiting.

  6. 6 yohu Commented @ 2007-01-25 5:53 amReply to this comment

    不要copy,楼主帖子里面的标点都是全角,直接copy肯定不行的。

  7. 7 vinsanity Commented @ 2007-02-01 11:45 amReply to this comment

    login as normal user

  8. 8 Stupid Kid Commented @ 2007-12-15 5:35 pmReply to this comment

    将festvoxus1.tar.gz解压后里面的us1mbrola文件夹放到 /usr/share/festival/voices/english/下,然后将us1-980512.zip解压后的文件夹放到 /usr/share/festival/voices/english/us1mbrola/下才能正常识别voiceus1_mbrola 这个命令