早上研究了下如何在Linux上实现TTS,发现科大迅飞的云平台已经提供了Linux下的TTS库,这里笔记下使用方式。
首先在官网上下载开发包【 http://www.xfyun.cn/services/online_tts 】,解压缩,可以看到里面有如下文件【 bin doc examples lib Linux_aisound_2.002_554cab08.zip prj readme.txt 】,这里我们打开readme.txt文件:
1.doc目录下存放开发文档等; 2.lib目录下存放SDK需要调用的动态库以及需要引用的头文件。 3.example目录下存放提供的示例demo,每个例子下都有Makefile文件,在当前目录make即可; 4.bin目录下存放符合标准的语音文件样例、配置文件和资源文件等,make之后的example可执行程序也会拷贝至此,请在此目录下运行,否则会运行失败; 5.prj目录下提供make脚本,可以快速编译例子。
根据文件的指示,我们可以看到SDK的大致组织形式。为了简单起见,我们只编译下demo。
CONTENTS
用命令行编译demo:
cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08$ cd examples/ttsdemo/ cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/examples/ttsdemo$ ls Makefile ttsdemo.c cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/examples/ttsdemo$ make 。。。。 。。。。 ttsdemo build success! cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/examples/ttsdemo$
这里如果一下子就成功了最好,如果没有成功,很可能是动态库对应不对。作者一开始编译的时候是没有成功的,因为作者的本地环境是x64的,但是makefile并没有严格的区分。为了简单,可以直接替换掉动态库:
cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08$ cd lib cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/lib$ mv libmsc.so libmsc.so_x86 cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/lib$ cp x64/libmsc.so libmsc.so
编译OK之后就可以执行了。根据readme.txt,需要在bin目录下执行,makefile已经帮忙把文件拷过去了。
cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08$ cd bin cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/bin$ ls msc ttsdemo cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/bin$ ldd ttsdemo linux-vdso.so.1 => (0x00007ffe2dbab000) libmsc.so => /usr/lib/libmsc.so (0x00007f723781c000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7237618000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f72373f9000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f72371f1000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7236e2d000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7236b26000) /lib64/ld-linux-x86-64.so.2 (0x00007f7237c17000) cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/bin$
由于demo的链接用的是动态库,因此我们需要看下动态库是否已经链接好了,我们使用ldd命令查看,如上,可以看到这里libmsc.so已经找到了。如果没有找到,可以使用如下命令将动态库添加到本地环境中,这里要注意下x64还是x86:
cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08$ sudo cp lib/libmsc.so /usr/bin/ cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08$ sudo ldconfig
搞定之后,就可以运行了。
cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/bin$ ls msc ttsdemo cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/bin$ ./ttsdemo ....... ....... cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/bin$ ls msc text_to_speech_test.pcm ttsdemo cstriker1407@cstriker1407-x64:~/下载/科大讯飞/Linux_aisound_2.002_554cab08/bin$
如果运行没有环境错误,那么说明本地环境已经OK了。如果运行后出现了其他错误,那么说明demo中的参数需要配置下,这里我们打开examples目录下的ttsdemo.c文件,部分内容如下:
int main(int argc, char* argv[]) { ///APPID请勿随意改动 const char* login_configs = " appid = 554cab08, work_dir = . ";//登录参数 const char* text = "科大讯飞是亚太地区最大的语音上市公司,股票代码:002230";//待合成的文本 const char* filename = "text_to_speech_test.pcm"; //合成的语音文件 const char* param = "engine_type = local, text_encoding = UTF8, tts_res_path = fo|res/tts/xiaoyan.jet;fo|res/tts/common.jet, sample_rate = 16000";//参数可参考开发文档 int ret = 0; char key = 0; //用户登录 ret = MSPLogin(NULL, NULL, login_configs);//第一个参数为用户名,第二个参数为密码,第三个参数是登录参数,用户名和密码需要在http://open.voicecloud.cn注册并获取appid if ( ret != MSP_SUCCESS ) { printf("MSPLogin failed , Error code %d.\n",ret); goto exit ;//登录失败,退出登录 }
和绝大多数云平台一样,科大迅飞的也需要应用并且校验。这里我们建立好应用,把appid更改为我们自己的appid,在MSPLogin中替换掉用户名和密码,再次编译,执行,应该就可以了。
使用eclipse编译demo:
在linux下进行C开发,使用eclipse还是比较方便的。这里简略的记录下,使用eclipse-cdt建立一个【 C Project 】-【 Makefile Project 】-【 Empty Project 】,工具链选择Linux GCC。然后将SDK的整个文件夹拷过去就OK了。
备注:
1 sdk在lib文件夹下提供了两个动态库,分别对应x86和x64版本的Linux。
2 prj文件夹下面提供提供的两个sh文件不知道是不是忘了改了,里面的demo的名称和这个SDK是不对应的。
3 demo编译完成后需要在bin目录下执行,这里的原因是因为demo使用的是离线引擎,需要本地资源目录,后面更改下demo就可以不受此限制了,更改也很简单,在main函数中有一个param,将里面的【 engine_type 】改为在线方式,即【 cloud 】,删掉【 tts_res_path 】,重新编译,就可以了。
4 运行demo时会有大量日志,作者个人认为和msc.cfg有关系,但是作者没有看到相关文档介绍,也没有深究。
5 demo的makefile看似很简单,但是还是有很多内容的,prj/scripts/下面有两个mk,也值得研究下。如果后面自己写makefile的话,有很好的参考价值。
发表评论