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

伪语音合成(2)

今天实现了中英文的选择,当然,并没有对可能出现的错误情况进行处理,比如说选项指明是英文而文本内容是中文……

首先,昨天写的那个脚本有点问题,先来看一下:

#!/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

当文本是用空格分开时,这个脚本会出错,原因是传递给函数的参数会严格按照空格进行划分,也就是说,类似

'how are you'

这样本来预期作为t2s函数的第一个参数会被分割成 how、are、you三个部分并将其作为t2s函数的 三个参数 ,导致错误。

正确的做法是将$1用双引号包裹起来。

这是今天修改后的脚本代码:

#!/bin/bash

FILE=""

t2s()
{
    first="$1";
    lang="";
    FILE=$(tr ' ' _ <<< "$first"| cut -b 1-15).mp3;

    shift;

    while getopts "ez" arg
    do
    case $arg in
        e)
        lang="en";
        ;;
        z)
        lang="zh";
        ;;
        ?)
        echo "Usage : t2s <text> -e/-z";
        echo "   -e : in English";
        echo "   -z : in Chinese";
        exit 1;
        ;;
    esac
    done

    wget -q -U google-chrome -O $FILE "http://translate.google.com/translate_tts?ie=UTF-8&tl=$lang&q=$(tr ' ' + <<< "$first")";
}

t2s "$1" $2 && play $FILE -q && rm $FILE

当然了……脚本参数的处理是很直接简单的处理方式。

另外,Google的中文语音合成效果不怎么样啊,不过其他的语音产品貌似不提供像Google这样的API,那也没办法了。