ZMonster's Blog 巧者劳而智者忧,无能者无所求,饱食而遨游,泛若不系之舟

伪语音合成(1)

今天在commandlinefu.com 上面看到一个函数的定义,挺有意思的,来看一下:

t2s() { wget -q -U Mozilla -O $(tr ' ' _ <<< "$1"| cut -b 1-15).mp3 "http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=$(tr ' ' + <<< "$1")"; }

下面注明了:

Usage: t2s 'how are you?'

这个函数很有意思,首先看这个函数的名字:t2s。

t2s是 Text to Speech 的缩写,也就是 语音合成 了,这个函数的功能正是语音合成,即将传入t2s函数的参数——文本,转换为语音。

再看看函数体:

wget -q -U Mozilla -O $(tr ' ' _ <<< "$1"| cut -b 1-15).mp3 "http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=$(tr ' ' + <<< "$1")";

没什么太复杂的东西,就是一条wget命令,不过其参数稍微复杂。

-q 选项是让wget以 quiet 模式运行, -U 指定浏览器(我也不知道为什么要指定,试了一下,不加的话结果会是错的……), -O 指定下载下来的文件名。

-O 选项的参数是一条shell命令的输出结果和 .mp3 这个后缀名的连接起来的结果:

tr ' ' _ <<< "$1" | cut -b 1-15

这条命令将函数t2s的第一个参数中的空格替换成下划线 _ ,然后最多取15个字符。

重点是后面那个网络地址:

http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=

这个是Google翻译的TTS的web api,通过它可以直接获取Google翻译界面的文本朗读功能对应的mp3文件。上面这个api要在后面加上要朗读的单词才是完整的——若有多个单词,则以 + 号连接。

然后我根据这个函数写了一个小脚本:

#!/bin/bash
t2s() {
    wget -q -U Mozilla -O $(tr ' ' _ <<< "$1"| cut -b 1-15).mp3 "http://translate.google.com/translate_tts?ie=UTF-8&tl=en&q=$(tr ' ' + <<< "$1")";
}

FILE=$(tr ' ' _ <<< "$1" | cut -b 1-15).mp3;
t2s $1 && play $FILE -q && rm $FILE

我这里用了play命令来直接在终端中播放音频文件——play命令是sox工具包里的一个命令,要正确播放,还要安装mp3格式支持:

sudo apt-get install libsox-fmt-mp3

之所以标题是 伪语音合成 ,就是因为我这里只是单纯地下载了对应的音频文件进行播放而已……真正的语音合成的工作都是Google做的。

另外,这个脚本里的t2s函数只对英文语句起作用,所以下一步我想写一个功能更丰富的脚本,能处理中英文。