【笔记】树莓派使用讯飞SDK实现语音识别跟语音播报
之前我们已经配置好了麦克风并且实现的正常的录音功能。现在我们就将录制的语音通过讯飞的SDK转换成文字,反过来也可以。由于讯飞SDK已经不支持树莓派,我从网上找到先前发布的支持树莓派的版本,主要参考网上大佬的文章:http://blog.csdn.net/yanghuan313/article/details/50992909, 如果有侵犯到大佬的地方,请告知,立马删除。我们尝试把它改造成两个小工具,可以方便我们用来实现语音跟文字的相互转换。
实验环境
硬件:树莓派3b一台、usb声卡一个、麦克风一个
操作系统:Raspbian with Desktop
操作步骤
1、下载讯飞SDK
请参考链接:http://blog.csdn.net/yanghuan313/article/details/50992909
2、安装
下载好SDK到用户目录后,可以在PC上下载后然后用FTP上传到树莓派 。然后把支持树莓派的动态库复制到系统目录。
pi@raspberrypi:~ $ sudo cp Linux_voice_1.109/libs/RaspberryPi/libmsc.so /usr/local/lib/
再复制头文件到系统目录
pi@raspberrypi:~ $ sudo cp Linux_voice_1.109/include/* /usr/local/include/
3、编译测试
完成以上步骤之后就可以编译SDK中自带的samples,以tts_sample为例。
pi@raspberrypi:~ $ cd Linux_voice_1.109/samples/tts_sample/
编辑32bit_make.sh文件,树莓派系统是32位系统,而且提供的SDK也是32位的
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ nano 32bit_make.sh
将export一行注释掉,文件内容如下:
#编译32位可执行文件
make clean;make
#设置libmsc.so库搜索路径
#export LD_LIBRARY_PATH=$(pwd)/../../libs/x86/
编辑Makefile文件
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ nano Makefile
将以下内容注释掉,因为我们刚才已经把动态库复制到系统目录下了,不需要再指定
#可根据实际需要修改,选择所需平台SDK,默认为x64或x86平台。
#ifdef LINUX64
#LDFLAGS := -L$(DIR_LIB)/x64
#else
#LDFLAGS := -L$(DIR_LIB)/x86
#endif
编译tts,编译成功后会在SDK根目录下的bin目录下生成tts_sample
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ source 32bit_make.sh
运行tts_sample,成功运行后会在同级目录下生成tts_sample.wav,调用mplayer播放测试
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ cd ~/Linux_voice_1.109/bin/
pi@raspberrypi:~/Linux_voice_1.109/bin $ ./tts_sample
pi@raspberrypi:~/Linux_voice_1.109/bin $ mplayer tts_sample.wav
4、实现文字转语音小工具
我们希望做成一个语音播放小工具,输入文字可以直接读出语音,比如可以这样用:
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ tts_sample "测试一下"
编辑tts_sample.c文件
pi@raspberrypi:~ $ cd Linux_voice_1.109/samples/tts_sample/
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ nano tts_sample.c
将main函数修改为如下,当然也可以把那些打印信息删除,暂且保留吧
int main(int argc, char* argv[])
{
int ret = MSP_SUCCESS;
const char* login_params = "appid = 56ee43d0, work_dir = .";//登录参数,appid与msc库绑定,请勿随意改动
/*
* rdn: 合成音频数字发音方式
* volume: 合成音频的音量
* pitch: 合成音频的音调
* speed: 合成音频对应的语速
* voice_name: 合成发音人
* sample_rate: 合成音频采样率
* text_encoding: 合成文本编码格式
*
* 详细参数说明请参阅《iFlytek MSC Reference Manual》
*/
const char* session_begin_params = "voice_name = xiaoyan, text_encoding = UTF8, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 2";
const char* filename = "tts_sample.wav"; //合成的语音文件名称
const char* text = "亲爱的用户,您好,这是一个语音合成示例,感谢您对科大讯飞语音技术的支持!科大讯飞是亚太地区最大的语音上市公司,股票代码:002230"; //合成文本
if(argc < 2)
{
printf("usage:tts_sample 测试\n");
return -1;
}
text = argv[1];
/* 用户登录 */
ret = MSPLogin(NULL, NULL, login_params);//第一个参数是用户名,第二个参数是密码,第三个参数是登录参数,用户名和密码可在http://open.voicecloud.cn注册获取
if (MSP_SUCCESS != ret)
{
printf("MSPLogin failed, error code: %d.\n", ret);
goto exit ;//登录失败,退出登录
}
printf("\n###########################################################################\n");
printf("## 语音合成(Text To Speech,TTS)技术能够自动将任意文字实时转换为连续的 ##\n");
printf("## 自然语音,是一种能够在任何时间、任何地点,向任何人提供语音信息服务的 ##\n");
printf("## 高效便捷手段,非常符合信息时代海量数据、动态更新和个性化查询的需求。 ##\n");
printf("###########################################################################\n\n");
/* 文本合成 */
printf("开始合成 ...\n");
ret = text_to_speech(text, filename, session_begin_params);
if (MSP_SUCCESS != ret)
{
printf("text_to_speech failed, error code: %d.\n", ret);
goto exit ;
}
printf("合成完毕\n");
system("mplayer tts_sample.wav");
exit:
//printf("按任意键退出 ...\n");
//getchar();
MSPLogout(); //退出登录
return 0;
}
编译tts_sample
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ source 32bit_make.sh
将编译好的tts_sample复制到系统bin目录下
pi@raspberrypi:~/Linux_voice_1.109/samples/tts_sample $ cd ~
pi@raspberrypi:~ $ sudo cp Linux_voice_1.109/bin/tts_sample /usr/local/bin/
接上音箱测试
pi@raspberrypi:~ $ tts_sample "这只是一个测试"
5、实现语音转文字小工具
对sample/iat_sample稍作修改并编译即可。需要注意的是传入的音频必须是单声道、16位、16000HZ采样率,可以调用arecord来录制
pi@raspberrypi:~ $ arecord -r 16000 -c 1 -t wav -f S16_LE test.wav
更多
关注微信公众号及时获取更新文章,欢迎大家跟我交流技术与想法: