ROS应用 —— Ubuntu16.04下科大讯飞 智能语音助手练习(4)

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两个节点。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值