续 ROS应用 —— Ubuntu16.04下科大讯飞语音合成的修改&使用(3)
1. 对 tts_subscribe.cpp 进行修改,主要为回调函数和主要函数的部分,并重命名为voice_assistant.cpp;注意:更改appid号为自己的;注意头文件引用的位置;
修改的主要代码:
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;
std::string dataString = msg->data;
if(dataString.compare("你是谁?") == 0)
{
char nameString[40] = "我是你的语音小助手";
text = nameString;
std::cout<<text<<std::endl;
}
else if(dataString.compare("你可以做什么?") == 0)
{
char helpString[40] = "你可以问我现在时间";
text = helpString;
std::cout<<text<<std::endl;
}
else if(dataString.compare("现在时间。") == 0)
{
//获取当前时间
struct tm *ptm;
long ts;
ts = time(NULL);
ptm = localtime(&ts);
std::string string = "现在时间" + to_string(ptm-> tm_hour) + "点" + to_string(ptm-> tm_min) + "分";
char timeString[40];
string.copy(timeString, sizeof(string), 0);
text = timeString;
std::cout<<text<<std::endl;
}
else
{
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");
unlink("/tmp/cmd");
mkfifo("/tmp/cmd", 0777);
popen("mplayer -quiet -slave -input file=/tmp/cmd 'tts_sample.wav'","r");
sleep(3);
}
int main(int argc, char* argv[])
{
......
ros::init(argc,argv,"TextToSpeech");
ros::NodeHandle n;
ros::Subscriber sub =n.subscribe("voiceWords", 1000,voiceWordsCallback);
ros::spin();
......
return 0;
}
2. 在CMakeList.txt中添加编译规则:
add_executable(voice_assistant src/voice_assistant.cpp) //编译文件,生成可执行文件
target_link_libraries(voice_assistant ${catkin_LIBRARIES} libmsc.so -ldl -lpthread) //添加需要链接的库
3. 编译整个工作空间: cd ~/catkin_ws ; catkin_make
4. 运行测试:
// 终端1:启动管理器节点
roscore
// 终端2:运行可执行文件(订阅voiceWords话题:唤醒功能)
rosrun robot_voice iat_publish
// 终端3:运行可执行文件(订阅voiceWords话题:语音合成功能)
rosrun robot_voice voice_assistant
// 终端4:在话题 voiceWords 上发布 std_msgs/String 类型的数据,内容为:你好,我是机器人
rostopic pub /voiceWakeup std_msgs/String "ok"
接下来就是调用了,可以直接说,也可以用指令发布消息:
方法一
比如:接下来对准麦克风说:你是谁
结果:语音系统播报:“我是你的语音小助手”
方法二
比如:打开一个新的终端,输入:rostopic pub /voiceWords std_msgs/String "你可以做什么?"
结果:结果:语音系统播报:“你可以问我现在时间”
这两种方法都会生成一个msc文件夹和.wav语音文件。
注:这里用了iat_publish和voice_assistant两个节点。