第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > ROS结合科大讯飞语音简单控制机器人

ROS结合科大讯飞语音简单控制机器人

时间:2022-12-04 03:15:25

相关推荐

ROS结合科大讯飞语音简单控制机器人

这是科大讯飞的语音SDK包做了一点修改,加上自己的语音控制代码

代码1:iat_publish.cpp

/*

* 语音听写(iFly Auto Transform)技术能够实时地将语音转换成对应的文字。

*/

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include "robot_voice/qisr.h"

#include "robot_voice/msp_cmn.h"

#include "robot_voice/msp_errors.h"

#include "robot_voice/speech_recognizer.h"

#include <iconv.h>

#include "ros/ros.h"

#include "std_msgs/String.h"

#define FRAME_LEN 640

#define BUFFER_SIZE 4096

int wakeupFlag = 1 ;

int resultFlag = 0 ;

static void show_result(char *string, char is_over)

{

resultFlag=1;

printf("\rResult: [ %s ]", string);

if(is_over)

putchar('\n');

}

static char *g_result = NULL;

static unsigned int g_buffersize = BUFFER_SIZE;

void on_result(const char *result, char is_last)

{

if (result) {

size_t left = g_buffersize - 1 - strlen(g_result);

size_t size = strlen(result);

if (left < size) {

g_result = (char*)realloc(g_result, g_buffersize + BUFFER_SIZE);

if (g_result)

g_buffersize += BUFFER_SIZE;

else {

printf("mem alloc failed\n");

return;

}

}

strncat(g_result, result, size);

show_result(g_result, is_last);

}

}

void on_speech_begin()

{

if (g_result)

{

free(g_result);

}

g_result = (char*)malloc(BUFFER_SIZE);

g_buffersize = BUFFER_SIZE;

memset(g_result, 0, g_buffersize);

printf("Start Listening...\n");

}

void on_speech_end(int reason)

{

if (reason == END_REASON_VAD_DETECT)

printf("\nSpeaking done \n");

else

printf("\nRecognizer error %d\n", reason);

}

/* demo recognize the audio from microphone */

static void demo_mic(const char* session_begin_params)

{

int errcode;

int i = 0;

struct speech_rec iat;

struct speech_rec_notifier recnotifier = {

on_result,

on_speech_begin,

on_speech_end

};

errcode = sr_init(&iat, session_begin_params, SR_MIC, &recnotifier);

if (errcode) {

printf("speech recognizer init failed\n");

return;

}

errcode = sr_start_listening(&iat);

if (errcode) {

printf("start listen failed %d\n", errcode);

}

/* demo 10 seconds recording */

while(i++ < 3)

sleep(1);

errcode = sr_stop_listening(&iat);

if (errcode) {

printf("stop listening failed %d\n", errcode);

}

sr_uninit(&iat);

}

/* main thread: start/stop record ; query the result of recgonization.

* record thread: record callback(data write)

* helper thread: ui(keystroke detection)

*/

void WakeUp(const std_msgs::String::ConstPtr& msg)

{

printf("waking up\r\n");

sleep(10000);

wakeupFlag=1;

}

int main(int argc, char* argv[])

{

// 初始化ROS

ros::init(argc, argv, "voiceRecognition");

ros::NodeHandle n;

ros::Rate loop_rate(10);

// 声明Publisher和Subscriber

// 订阅唤醒语音识别的信号

ros::Subscriber wakeUpSub = n.subscribe("voiceWakeup", 1000, WakeUp);

// 订阅唤醒语音识别的信号

ros::Publisher voiceWordsPub = n.advertise<std_msgs::String>("voiceWords", 1000);

ROS_INFO("Sleeping...");

int count=0;

while(ros::ok())

{

// 语音识别唤醒

if (wakeupFlag){

ROS_INFO("Wakeup...");

int ret = MSP_SUCCESS;

const char* login_params = "appid = 593ff61d, work_dir = .";

const char* session_begin_params =

"sub = iat, domain = iat, language = zh_cn, "

"accent = mandarin, sample_rate = 16000, "

"result_type = plain, result_encoding = utf8";

ret = MSPLogin(NULL, NULL, login_params);

if(MSP_SUCCESS != ret){

MSPLogout();

printf("MSPLogin failed , Error code %d.\n",ret);

}

printf("Demo recognizing the speech from microphone\n");

printf("Speak in 10 seconds\n");

demo_mic(session_begin_params);

printf("10 sec passed\n");

wakeupFlag=1;

MSPLogout();

}

// 语音识别完成

if(resultFlag){

resultFlag=0;

std_msgs::String msg;

msg.data = g_result;

voiceWordsPub.publish(msg);

}

ros::spinOnce();

loop_rate.sleep();

count++;

}

exit:

MSPLogout(); // Logout...

return 0;

}

代码2:sub_word

#include<ros/ros.h>

#include<geometry_msgs/Twist.h>

#include<std_msgs/String.h>

#include<pthread.h>

#include<iostream>

#include<stdio.h>

using namespace std;

ros::Publisher pub;

geometry_msgs::Twist vel_cmd;

pthread_t pth_[5];

void* vel_ctr(void* arg)

{

while(true)

{

pub.publish(vel_cmd);

ros::spinOnce();

sleep(1);

}

return 0;

}

void callback(const std_msgs::String::ConstPtr& msg)

{

cout<<"好的:"<<msg->data.c_str()<<endl;

string str1 = msg->data.c_str();

string str2 = "向前。";

string str3 = "后退。";

string str4 = "左转。";

string str5 = "右转。";

string str6 = "停止。";

if(str1 == str2)

{

cout<<"11111"<<endl;

vel_cmd.linear.x = 1;

vel_cmd.angular.z = 0;

pthread_create(&pth_[0],NULL,vel_ctr,NULL);

}

if(str1 == str3)

{

vel_cmd.linear.x = -1;

vel_cmd.angular.z = 0;

pthread_create(&pth_[1],NULL,vel_ctr,NULL);

}

if(str1 == str4)

{

vel_cmd.linear.x = 0;

vel_cmd.angular.z = 1;

pthread_create(&pth_[2],NULL,vel_ctr,NULL);

}

if(str1 == str5)

{

vel_cmd.linear.x = 0;

vel_cmd.angular.z = -1;

pthread_create(&pth_[3],NULL,vel_ctr,NULL);

}

if(str1 == str6)

{

vel_cmd.linear.x = 0;

vel_cmd.angular.z = 0;

pthread_create(&pth_[0],NULL,vel_ctr,NULL);

}

}

int main(int argc, char** argv)

{

ros::init(argc, argv, "sub_word");

ros::NodeHandle n;

pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);

ros::Subscriber sub = n.subscribe("voiceWords",10,callback);

cout<<"您好!你可以语音控制啦!"<<endl;

cout<<"向前行———————————>向前"<<endl;

cout<<"向后退———————————>后退"<<endl;

cout<<"向左转———————————>左转"<<endl;

cout<<"向右转———————————>右转"<<endl;

cout<<"使停止———————————>停止"<<endl;

ros::spin();

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。