好记性不如铅笔头

linux, 编程

Linux下使用科大迅飞的在线TTS

早上研究了下如何在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的话,有很好的参考价值。

发表评论

12 − 1 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据