续 ROS应用 —— Ubuntu16.04下科大讯飞语音听写的修改&使用(2)
1. 将Linux_iat1218_5c6e7f8d/samples/tts_online_sample下的tts_online_sample.c放到catkin_ws/src/robot_voice/src下,并更改其代码,重命名为 tts_subscribe.cpp;
注:appid号更改为你自己的;
- tts_subscribe.cpp的代码如下,主要更改了回调函数,即文本合成部分;此外,可能注意 #include 头文件中删除“robot_voice/”,这主要跟头文件的具体位置有关;
// 修改部分的代码
void voiceWordsCallback(const std_msgs::String::ConstPtr& msg)
{
char cmd[2000];
const char* text;
int ret = MSP_SUCCESS;
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"; //合成的语音文件名称
std::cout<<"I heard :"<<msg->data.c_str()<<std::endl;
text = msg->data.c_str();
/* 文本合成 */
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);
}
printf("合成完毕\n");
int main(int argc, char* argv[])
{
int ret = MSP_SUCCESS;
const char* login_params = "appid = 5c6e7f8d, work_dir = .";//登录参数,appid与msc库绑定,请勿随意改动
/*
* rdn: 合成音频数字发音方式
* volume: 合成音频的音量
* pitch: 合成音频的音调
* speed: 合成音频对应的语速
* voice_name: 合成发音人
* sample_rate: 合成音频采样率
* text_encoding: 合成文本编码格式
*
* 详细参数说明请参阅《讯飞语音云MSC--API文档》
*/
/* 用户登录 */
ret = MSPLogin(NULL, NULL, login_params);//第一个参数是用户名,第二个参数是密码,第三个参数是登录参数,用户名和密码可在http://open.voicecloud.cn注册获取
if (MSP_SUCCESS != ret)
{
printf("MSPLogin failed, error code: %d.\n", ret);
/*goto exit ;*///登录失败,退出登录
toExit();
}
printf("\n###########################################################################\n");
printf("## 语音合成(Text To Speech,TTS)技术能够自动将任意文字实时转换为连续的 ##\n");
printf("## 自然语音,是一种能够在任何时间、任何地点,向任何人提供语音信息服务的 ##\n");
printf("## 高效便捷手段,非常符合信息时代海量数据、动态更新和个性化查询的需求。 ##\n");
printf("###########################################################################\n\n");
ros::init(argc,argv,"TextToSpeech");
ros::NodeHandle n;
ros::Subscriber sub =n.subscribe("voiceWords", 1000,voiceWordsCallback);
ros::spin();
exit:
printf("按任意键退出 ...\n");
getchar();
MSPLogout(); //退出登录
return 0;
}
2. 在 CMakeList.txt 中添加编译规则:
add_executable(tts_subscribe src/tts_subscribe.cpp)
target_link_libraries(tts_subscribe ${catkin_LIBRARIES} libmsc.so -ldl -lpthread)
3. 编译整个工作空间:
- cd ~/catkin_ws
- catkin_make
4. 运行测试:
// 终端1:启动管理器节点
roscore
// 终端2:运行可执行文件(订阅voiceWords话题)
rosrun robot_voice tts_subscribe
// 终端3:在话题 voiceWords 上发布 std_msgs/String 类型的数据,内容为:你好,我是机器人
rostopic pub /voiceWords std_msgs/String "你好,我是机器人"
注:rostopic pub [话题名称] [消息类型] [参数]:使用指定的话题名称发布消息参数详解;
这时机器人会用普通话说出:"你好,我是机器人";终端结果如下图所示:
此外,还会生成一个msc文件夹和.wav语音文件,生成的位置由自己执行命令的终端位置决定:
可能出现的问题
问题1
报错:sh: 1: mplayer: not found
原因:没有安装mplayer;
解决:sudo apt-get install mplayer
问题2
报错:
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.
原因:mplayer的配置问题;
解决:
// 打开~/.mplayer/config 文件
sudo gedit ~/.mplayer/config
// 添加如下配置:
lirc=no
// 重新执行刚修改的初始化文件
source ~/.mplayer/config
问题3
报错:
QTTSAudioGet failed, error code: 10407.
text_to_speech failed, error code: 10407.
原因:appid号没有更改;
解决:更改为自己的appid号;