Flite,一种开源的tts软件从安装到…

一. 下载安装:
(1)下载地址:http://www.speech.cs.cmu.edu/flite/download.html
(2) 和一般的开源软件安装步骤基本一致:
      tar zxvf flite-XXX.tar.gz
      cd flite-XXX
      ./configure (可选项 --prefix=/opt 意思是指定安装目录,其实不需要特别指定,flite会默认安装在/usr/local下面)
       make
       sudo make install

二. 使用:
在linux下通过flite命令可以使用文字转语音功能:
flite -t hello 直接将hello这个单词读出来,你也可以用命令flite “hello world”
flite hello 此命令中hello是一个文件的名字,flite会将hello文件中的内容读出来
flite -f hello.txt (同上)
flite -f hello.txt -o test.wav (将读出的语音保存在test.wav中)
flite -lv (查看当前支持的声音种类)
flite -voice slt -f hello.txt (选择语音库,"slt"是一个女声的语音库,听起来比较好听,我通过-lv命令查到之后就用这个了)

三. 修改源码,搞点定制功能(我用的源码是flite-1.4-release.tar.bz2)
     虽然flite命令很好用,有很多功能,但是如果我们想将flite移植到更小的操作系统上面,比如某个只有很少资源的android的arm板上的话,通过改源码来实现我们想要的功能才是比较实际的。
     下面,就来搞定刚刚提到的选择语音库的功能。上级领导要求我们做的tts要能听到清晰好听的声音,比较了一下flite当前支持的几个语音库,最终觉得“slt”最好听,因为是女生的声音,嘻嘻~~。但是代码中默认选择的是“kal”语音库,一个听起来不够可爱的男声,也不太清晰,怎么能从代码中把这个地方找到呢(因为当时不知道默认选择的语音库的名字是“kal”,这个是我后来找到它才知道的)?
      看到一个文档中写所有发布的语音库都列在一个全局list中,flite_voice_list,顺藤摸瓜,找到了它在flite_voice_select函数中被用到,我猜这个flite_voice_select函数应该对应的就是flite -voice *** 命令了,加了一条打印信息,再编译,安装,输入命令的时候果真看到了我刚刚添加的打印信息。可是这个flite_voice_select函数只是帮忙选出了命令行指定要用的语音库(在程序代码中对应的是一个数据结构),到底是怎么将它指定到语音输出的呢?哦,原来在flite_main.c文件中的main函数中。

下面这个应该就是输入命令flite -voice ***时,完成语音库选择的程序代码:
Flite,一种开源的tts软件从安装到使用

下面这段代码,应该是输入命令时不指定-voice ***,那么就默认有一个语音库被选择,无论怎样,最后desired_voice都赋值给变量v,v是一个“cst_voice”结构体指针,也是最后执行flite_**_to_speech函数时传入的一个参数,v即表明选择哪个语音库。
Flite,一种开源的tts软件从安装到使用

下面才是真正执行tts功能的函数,那个参数v即上面的desired_voice,找到这里就找到了源头了,想要改变语音库,只需要改变flite_***_to_speech函数的第二个参数就可以了。
Flite,一种开源的tts软件从安装到使用

下面是我写的代码,通过调用flite API 实现的,将文本的内容转成语音发出。
#include "flite.h"
cst_voice *register_cmu_us_kal(const char *voxdir);
int main(int argc, char **argv)
{
    cst_voice *v;
    if (argc != 2) {
        fprintf(stderr,"usage: flite_test FILE\n");
        exit(-1);
    }
    flite_init();
    v = register_cmu_us_kal(NULL);
    flite_file_to_speech(argv[1],v,"play");
    return 0;
}
从上面代码可看出,v的值来自 register_cmu_us_kal(NULL)函 只要将v改变就可以改变语音库了
Flite,一种开源的tts软件从安装到使用
其实这个函数的参数是没有用到的,不知道为什么搞一个参数
函数 register_cmu_us_kal 实现的是注册一个默认的语音库"kal",源码lang/目录中还有类似的函数,都是注册相应的语音库的,那么只需要找到“slt”语音库的注册函数,就可以换一个默认的语音库,函数在这里:
Flite,一种开源的tts软件从安装到使用

将源代码中的 v = register_cmu_us_kal(NULL); 改成   v = register_cmu_us_slt(NULL);
再加一句, cst_voice *register_cmu_us_slt(const char *voxdir);
另外,在编译flite源码的时候记得要编译新的语音库"slt"哦
比如
我原来裁剪的时候是将slt裁剪掉了,现在想要用"slt"语音库了,代码改完,却编译不过,才想起来,是由于我之前将"slt"部分代码(lang/cmu_us_slt/目录下的代码)都删掉了,现在再加回来就OK啦!

开源就是好啊,记录完毕,over!



有一本书是讲flite的,推荐给大家 此次的源码修改最初头绪都是来自这本书)
http://pan.baidu.com/share/link?shareid=1419587388&uk=3909358855
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值