2019-04-20 18:29:18 cool_bot 阅读数 107
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

语音识别控制硬件实验(语音转文字)

首先安装百度的api

sudo apt install mpg123
pip install baidu-aip monotonic pyaudio

如果出现error: command ‘arm-linux-gnueabihf-gcc’ failed with exit status 1
可能是python依赖没做好
python2.x:
sudo apt-get install python-dev
sudo apt-get install libevent-dev
python3.x:
sudo apt-get install python3-dev
sudo apt-get install libevent-dev

作者:PaulYoung_Blog
来源:CSDN
https://blog.csdn.net/talkxin/article/details/52181650

或者进入python激活环境
pi@raspberrypi:~ $ source ~/env/bin/activate# 激活Python虚拟环境

1.获取百度的key
百度keys
在Main_Demo.py里第6,7,8行添加百度密钥

2.打开程序目录4Mic_RGB

pi@raspberrypi:~ $ source ~/env/bin/activate# 激活Python虚拟环境, 如果已经激活,调到下一步
(env) pi@raspberrypi:~/ voice_control $ python Main_Demo.py

就可以实现语音识别并输出文字

2019-11-11 21:02:02 weixin_42466538 阅读数 13
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波
基于文本情感分类的语音识别控制系统
技术领域
本发明涉及语音识别技术领域,更为具体地,涉及一种基于文本情感分类的语音识别控制系统。
背景技术
传统的语音识别技术,主要采用模板匹配的方法,在孤立词汇的识别上取得了较好的效果。但是,对于大量的连续语音而言,模板匹配方法遇到了困难,由于语音识别的准确率依赖于匹配的准确率,因此需要大量的语音匹配模板,造成匹配系统设计复杂,匹配效率低,消耗资源要求也高。
近年来,提出了一些基于文本情感分类和深度学习的语音识别方法,由于基于情感词典的文本情感分类对人的记忆和判断思维的最简单的模拟,存在识别准确率较低的问题,进一步利用深度学习算法可以提高准确度,但是实现成本较高,系统设计很复杂等。
发明内容
本发明的目的在于克服现有技术的不足,提供一种基于文本情感分类的语音识别控制系统,提高了语音识别的准确率,降低了语音识别系统的复杂性,保障识别准确度的同时降低了实现成本。
本发明的目的是通过以下技术方案来实现的:
一种基于文本情感分类的语音识别控制系统,包括文本预处理模块,用于剔除html标签,并进行数据清洗识别出情感词汇,将识别出的感词汇分类导入文本情感模板;文件上传模块,用于将文本情感模板和语音文件上传到服务器;语音识别服务器,在所述语音识别服务器中设置有语音识别程序模块,所述语音识别程序模块包括文件查询接口模块、特征提取模块和解码器模块;所述文件查询接口模块,用于检索查询是否上传有新的语音文件;所述特征提取模块用于将上传的语音文件的所有特征向量按时间顺序排列,将排列好的特征向量分成多等份,对每一等份进行池化,然后将所有向量拼起来再次池化处理,从而得到全局特征并形成语音记录文件;所述解码器模块,用于将语音记录文件解码成文本信息,并与文本情感模板进行匹配;文件下载模块,用于将语音记录文件传输到手机端和计算机端;在计算机端通过计算机现实模块输出语音识别结果;在手机端,通过手机显示模块输出语音识别结果。
进一步的,包括数据爬取模块,用于爬取网页数据。
进一步的,所述文本情感模板包括积极词汇情感模板、消极词汇情感模板。
进一步的,包括终端测深度学习模块,所述终端测深度学习模块用于训练识别录入语音。
进一步的,所述终端测深度学习模块包括计算机端深度学习模块,所述终端测深度学习模块用于训练识别录入语音。
进一步的,所述终端测深度学习模块包括手机端深度学习模块,所述终端测深度学习模块用于训练识别录入语音。
本发明的有益效果是:
(1)本发明提高了语音识别的准确率,降低了语音识别系统的复杂性,保障识别准确度的同时降低了实现成本。具体的,形成语音记录文件,提高了特征提取效率,通过将语音记录文件解码成文本信息并与文本情感模板进行匹配,与语音匹配相比,降低了匹配难度,提高了匹配准确性,实现了快速匹配正确的语音记录文件,不仅提高了匹配效率,而且使得系统设计更加简单,降低了实现成本。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的结构框图。
具体实施方式
下面结合附图进一步详细描述本发明的技术方案,但本发明的保护范围不局限于以下所述。本说明书中公开的所有特征,或隐含公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。
本说明书(包括任何附加权利要求、摘要和附图)中公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
下面将详细描述本发明的具体实施例,应当注意,这里描述的实施例只用于举例说明,并不用于限制本发明。在以下描述中,为了提供对本发明的透彻理解,阐述了大量特定细节。然而,对于本领域普通技术人员显而易见的是:不必采用这些特定细节来实行本发明。在其他实例中,为了避免混淆本发明,未具体描述公知的电路,软件或方法。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在对实施例进行描述之前,需要对一些必要的术语进行解释。例如:
若本申请中出现使用“第一”、“第二”等术语来描述各种元件,但是这些元件不应当由这些术语所限制。这些术语仅用来区分一个元件和另一个元件。因此,下文所讨论的“第一”元件也可以被称为“第二”元件而不偏离本发明的教导。应当理解的是,若提及一元件“连接”或者“联接”到另一元件时,其可以直接地连接或直接地联接到另一元件或者也可以存在中间元件。相反地,当提及一元件“直接地连接”或“直接地联接”到另一元件时,则不存在中间元件。
在本申请中出现的各种术语仅仅用于描述具体的实施方式的目的而无意作为对本发明的限定,除非上下文另外清楚地指出,否则单数形式意图也包括复数形式。
当在本说明书中使用术语“包括”和/或“包括有”时,这些术语指明了所述特征、整体、步骤、操作、元件和/或部件的存在,但是也不排除一个以上其他特征、整体、步骤、操作、元件、部件和/或其群组的存在和/或附加。
2019-04-23 21:09:37 qq_37082966 阅读数 605
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

科大讯飞语音识别控制实际机器人运动。

本文将ros与语音识别想结合进行开发。进行以下步骤,
1、创作ros工作空间
2、安装mpalyer播放器

sudo apt-get install mplayer

3、将讯非的语音库动态文件.so文件放到/usr/lib/下
4、ros工程目录src下新建文件xf_asr.cpp 并将以下内容复制进去,appid改成你自己的(官网申请)。

/*
* 语音听写(iFly Auto Transform)技术能够实时地将语音转换成对应的文字。
*/
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "qisr.h"
#include "msp_cmn.h"
#include "msp_errors.h"
#include "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   = 0 ;
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++ < 2)
        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");
    usleep(700*1000);
    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 = , 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 3 seconds\n");
 	
            demo_mic(session_begin_params);
 
            printf("3 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;
}

5、CMakeLists.txt增加以下代码

add_executable(xf_asr src/xf_asr.cpp)
target_link_libraries(xf_asr ${catkin_LIBRARIES} -lmsc  -ldl -lpthread -lm -lrt)
add_dependencies(xf_asr xf_voice_generate_messages_cpp)(这句要不要都可以)

6、回到工作空间编译,编译后source一下。此时语音识别已经可以运行,打开新的终端运行roscore。在另一个终端运行asr。
7、添加语音控制的package,新创建一个新的package,在新的src里面创建voice_cmd.cpp。复制一下代码、

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
#include<std_msgs/String.h>
#include<pthread.h>
#include<iostream>
#include<stdio.h>
//#include<string.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 package_name::type_name & msg)
void callback(const std_msgs::String::ConstPtr& msg)
{
    cout<<"收到:"<<msg->data.c_str()<<endl;
    string str1 = msg->data.c_str();
    string str2 = "11";
    string str3 = "22";
    string str4 = "33";
    string str5 = "44";
    string str6 = "55";
    if(str1 == str2)
//    if(strstr(&str1, &str2))
    {
        cout<<"11111"<<endl;
        vel_cmd.linear.x = 0.2;
        vel_cmd.angular.z = 0;
        pthread_create(&pth_[0],NULL,vel_ctr,NULL);
    }
    if(str1 == str3)
    //if(strstr(&str1 , &str3))
    {
        vel_cmd.linear.x = -0.2;
        vel_cmd.angular.z = 0;
        pthread_create(&pth_[1],NULL,vel_ctr,NULL);
    }
    if(str1 == str4)
    //if(strstr(&str1 , &str4))
    {
        vel_cmd.linear.x = 0;
        vel_cmd.angular.z = 0.05;
        pthread_create(&pth_[2],NULL,vel_ctr,NULL);
    }
    if(str1 == str5)
    //if(strstr(&str1 ,&str5))
    {
        vel_cmd.linear.x = 0;
        vel_cmd.angular.z = -0.05;
        pthread_create(&pth_[3],NULL,vel_ctr,NULL);
    }
    if(str1 == str6)
    //if(strstr(&str1 ,&str6))
    {
        vel_cmd.linear.x = 0;
        vel_cmd.angular.z = 0;
        pthread_create(&pth_[4],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>("/cmd_vel_mux/input/teleop",10);
    pub = n.advertise<geometry_msgs::Twist>("/mobile_base/mobile_base_controller/cmd_vel",1000);
    
    ros::Subscriber sub = n.subscribe("/voiceWords",10,callback);
//    ros::Subscriber sub = n.subscribe("read",10,callback);
    //ros::Publisher pub = n.advertise<geometry_msgs::Twist>("/cmd_vel_mux/input/teleop", 10);
    
cout<<"您好!你可以语音控制啦!"<<endl;
cout<<"向前行———————————>前进"<<endl;
cout<<"向后退———————————>后退"<<endl;
cout<<"向左转———————————>左转"<<endl;
cout<<"向右转———————————>右转"<<endl;
cout<<"使停止———————————>停止"<<endl;
    ros::spin();
}

8、同理在Cmakelist加上以下:

add_executable(voice_cmd src/voice_cmd.cpp)
target_link_libraries(voice_cmd ${catkin_LIBRARIES} )
add_dependencies(voice_cmd voice_cmd_generate_messages_cpp)

9、回到工作空间编译,运行。
10、运行上面两个模块后再打开一个终端运行rqt_graph查看节点图是否联通。(完)

或者用python去控制机器人运动,订阅asr的内容,
以下是python代码:

#!/usr/bin/env python
# This Python file uses the following encoding: utf-8
import os, sys

import roslib; roslib.load_manifest('pocketsphinx')
import rospy
import math


from geometry_msgs.msg import Twist
from std_msgs.msg import String

class voice_cmd_vel:

    def __init__(self):
        rospy.on_shutdown(self.cleanup)
        self.speed = 0.2
        self.msg = Twist()
	
	

        # publish to cmd_vel, subscribe to speech output
        #self.pub_ = rospy.Publisher('/mobile_base/commands/velocity', Twist)
	self.pub_ = rospy.Publisher('/mobile_base/mobile_base_controller/cmd_vel', Twist)
        rospy.Subscriber('/voiceWords', String, self.speechCb)

	r = rospy.Rate(10.0)
	while not rospy.is_shutdown():
            self.pub_.publish(self.msg)
            r.sleep()
        
    def speechCb(self, msg):
        rospy.loginfo(msg.data)
	
        #if msg.data.find("full speed") > -1:
	if msg.data.find("加速") > -1:
            if self.speed == 0.2:
                self.msg.linear.x = self.msg.linear.x*2
                self.msg.angular.z = self.msg.angular.z*2
                self.speed = 0.4
        if msg.data.find("减速") > -1:
            if self.speed == 0.4:
                self.msg.linear.x = self.msg.linear.x/2
                self.msg.angular.z = self.msg.angular.z/2
                self.speed = 0.2
	if msg.data.find("前进") > -1:
        #if msg.data.find("forward") > -1:    
            self.msg.linear.x = self.speed
            self.msg.angular.z = 0
        elif msg.data.find("左转") > -1:
            if self.msg.linear.x != 0:
                if self.msg.angular.z < self.speed:
                    self.msg.angular.z += 0.05
            else:        
                self.msg.angular.z = self.speed*2
        elif msg.data.find("右转") > -1:    
            if self.msg.linear.x != 0:
                if self.msg.angular.z > -self.speed:
                    self.msg.angular.z -= 0.05
            else:        
                self.msg.angular.z = -self.speed*2
        elif msg.data.find("后退") > -1:
            self.msg.linear.x = -self.speed
            self.msg.angular.z = 0
        elif msg.data.find("停止") > -1 or msg.data.find("立定") > -1:          
            self.msg = Twist()
        
        self.pub_.publish(self.msg)
	
	

    def cleanup(self):
        # stop the robot!
        twist = Twist()
        self.pub_.publish(twist)

if __name__=="__main__":
    rospy.init_node('voice_cmd_vel')
    try:
        voice_cmd_vel()
    except:
        pass

2018-08-07 15:51:00 weixin_33995481 阅读数 767
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

代码地址如下:
http://www.demodashi.com/demo/12946.html

Python实时语音识别控制

概述

本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio 库录制语音指令,保存为受支持的 wav 音频文件,然后利用 百度语音识别库 提供的方法实现语音识别,最后检测识别结果,利用 PyUserInput 库提供的方法模拟控制web页面滚动。
百度语音识别为开发者提供业界优质且免费的语音服务,通过场景识别优化,为车载导航,智能家居和社交聊天等行业提供语音解决方案,准确率达到90%以上,让您的应用绘“声”绘色。

百度语音AI

准备工作

安装百度语音识别SDK

pip install baidu-aip

安装Python音频处理库 PyAudio

python -m pip install pyaudio

安装鼠标控制库 PyUserInput

pip install pyuserinput

PyUserInput 库依赖另外两个库 pywin32pyHook ,需要单独安装。
安装方法可以参考下面这篇文章:Win10 Python3.5安装PyUserInput

令附文中提到的资源下载链接:lfd-pythonlibs

另外文中提到的两个包, 需要根据自己的系统和python版本来选择。

如果系统是64位的,就要选择带 amd64 的。

如果python版本为python3.7的,就要选择带 cp37 的。

比如:pywin32-223-cp37-cp37m-win_amd64.whl
pyHook-1.5.1-cp37-cp37m-win_amd64.whl

申请百度开发者帐号

参考下面链接中的文章注册百度帐号,完成开发者认证,创建应用,获取密钥
百度AI开放平台接入流程

用Pyaudio库录制音频

Pyaudio 是一个非常强大的音频处理库,简单几行代码即可实现音频播放,录制等功能.
百度语音识别API支持的语音格式有: pcm(不压缩)wav(不压缩,pcm编码)amr(压缩格式).
推荐 pcm , 采样率: 16000 固定值, 编码: 16bit , 位深: 单声道 .百度服务端会将非pcm格式, 转为pcm格式, 因此使用wav, amr会有额外的转换耗时.
为了实现实时语音识别功能, 这里通过pyaudio录制一段wav格式的音频, 报文成wav音频文件, 供后续识别时调用.

# 用Pyaudio库录制音频
#   out_file:输出音频文件名
#   rec_time:音频录制时间(秒)
def audio_record(out_file, rec_time):
    CHUNK = 1024
    FORMAT = pyaudio.paInt16 #16bit编码格式
    CHANNELS = 1 #单声道
    RATE = 16000 #16000采样频率
    
    p = pyaudio.PyAudio()
    # 创建音频流 
    stream = p.open(format=FORMAT, # 音频流wav格式
                    channels=CHANNELS, # 单声道
                    rate=RATE, # 采样率16000
                    input=True,
                    frames_per_buffer=CHUNK)

    print("Start Recording...")

    frames = [] # 录制的音频流
    # 录制音频数据
    for i in range(0, int(RATE / CHUNK * rec_time)):
        data = stream.read(CHUNK)
        frames.append(data)
    
    # 录制完成
    stream.stop_stream()
    stream.close()
    p.terminate()

    print("Recording Done...")

    # 保存音频文件
    wf = wave.open(out_file, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()

调用百度语音API

# 读取paudio录制好的音频文件, 调用百度语音API, 设置api参数, 完成语音识别
#    client:AipSpeech对象
#    afile:音频文件
#    afmt:音频文件格式(wav)
def aip_get_asrresult(client, afile, afmt):
    # 选项参数:
    # cuid    String  用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内
    # dev_pid String  语言类型(见下表), 默认1537(普通话 输入法模型)
    # 识别结果已经被SDK由JSON字符串转为dict
    result = client.asr(get_file_content(afile), afmt, 16000, {"cuid": CUID, "dev_pid": DEV_PID,})
    #print(result)
    # 如果err_msg字段为"success."表示识别成功, 直接从result字段中提取识别结果, 否则表示识别失败
    if result["err_msg"] == "success.": 
        #print(result["result"])
        return result["result"]
    else:
        #print(result["err_msg"])
        return ""

dev_pid 参数列表

dev_pid 语言 模型 是否有标点 备注
1536 普通话(支持简单的英文识别) 搜索模型 无标点 支持自定义词库
1537 普通话(纯中文识别) 输入法模型 有标点 不支持自定义词库
1737 英语 有标点 不支持自定义词库
1637 粤语 有标点 不支持自定义词库
1837 四川话 有标点 不支持自定义词库
1936 普通话远场 远场模型 有标点 不支持

控制(鼠标)页面滚动

# 控制鼠标滚动
def mouse_control(dir_tr):
    MOVE_DX = 5 # 每次滚动行数
    ms = PyMouse()
    horizontal = 0
    vertical = 0
    if dir_tr.find("上") != -1: # 向上移动
        vertical = MOVE_DX
        #print("vertical={0}, 向上".format(vertical))
    elif dir_tr.find("下") != -1: # 向下移动
        vertical = 0 - MOVE_DX
        #print("vertical={0}, 向下".format(vertical))
    elif dir_tr.find("左") != -1: # 向左移动
        horizontal = 0 - MOVE_DX
        #print("horizontal={0}, 向左".format(horizontal))
    elif dir_tr.find("右") != -1: # 向右移动
        horizontal = MOVE_DX
        #print("horizontal={0}, 向右".format(horizontal))

    #print("horizontal, vertical=[{0},{1}]".format(horizontal, vertical))
    # 通过scroll(vertical, horizontal)函数控制页面滚动
    # 另外PyMouse还支持模拟move光标,模拟鼠标click,模拟键盘击键等
    ms.scroll(vertical, horizontal) 

完成实时语音识别控制

while(True):
    # 请说出语音指令,例如["向上", "向下", "向左", "向右"]
    print("\n\n==================================================")
    print("Please tell me the command(limit within 3 seconds):")
    #print("Please tell me what you want to identify(limit within 10 seconds):")
    audio_record(AUDIO_OUTPUT, 3) # 录制语音指令
    print("Identify On Network...")
    asr_result =  aip_get_asrresult(client, AUDIO_OUTPUT, AUDIO_FORMAT) # 识别语音指令
    if len(asr_result) != 0: # 语音识别结果不为空,识别结果为一个list
        print("Identify Result:", asr_result[0])
        print("Start Control...")
        mouse_control(asr_result[0]) # 根据识别结果控制页面滚动
        print("Control End...")
        if asr_result[0].find("退出") != -1: # 如果是"退出"指令则结束程序
            break;
        time.sleep(1) # 延时1秒

程序运行截图

语音识别

程序运行截图

语音控制

程序运行截图

项目内文件截图

项目内文件截图
Python实时语音识别控制

代码地址如下:
http://www.demodashi.com/demo/12946.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

2015-09-16 13:28:05 waldmer 阅读数 2057
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    5905 人正在学习 去看看 杨波

语音识别控制QQ

QQ.cpp 单独测试控制qq的各种命令

#include<Windows.h>

void openqq()
{
	ShellExecuteA(0, "open", "\"C:\\Program Files (x86)\\Tencent\\QQ\\QQProtect\\Bin\\QQProtect.exe\"", 0, 0, 1);
}

void closeqq()
{
	system("taskkill /f /im QQ.exe");
}

void show()
{
	HWND win = FindWindowA("TXGuiFoundation","QQ2013");
	if (win != NULL)
	{
		ShowWindow(win, SW_SHOW);
	}
}

void  hide()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		ShowWindow(win, SW_HIDE);
	}
}


void  shang()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left, rectwind.top-100, 300, 300, 1);
	}
}

void xia()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left, rectwind.top + 100, 300, 300, 1);
	}
}

void zuo()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left-100, rectwind.top , 300, 300, 1);
	}
}

void you()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left + 100, rectwind.top, 300, 300, 1);//设置区域位置
	}
}

void main()
{
	openqq();
	Sleep(3000);
	/*show();
	Sleep(2000);
	hide();*/
	shang();
	Sleep(2000);
	shang();

	Sleep(2000);
	//closeqq();
}

speechrecognition.cpp 结合到语音控制qq移动

#include <windows.h>
#include <atlstr.h>
#include <sphelper.h>
#include <sapi.h>
#include<comutil.h>
#include<string.h>

#pragma comment(lib,"sapi.lib")
#pragma comment(lib, "comsupp.lib") 

#define GID_CMD_GR 333333
#define WM_RECOEVENT WM_USER+1

 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

 void openqq();
 void you();
 void zuo();
 void shang();
 void xia();
 void closeqq();
 void show();
 void hide();



 char 	 szAppName[] = "TsinghuaYincheng";
 BOOL b_initSR;
 BOOL b_Cmd_Grammar;
 CComPtr<ISpRecoContext>m_cpRecoCtxt;  //语音识别程序接口
 CComPtr<ISpRecoGrammar>m_cpCmdGramma; //识别语法
 CComPtr<ISpRecognizer>m_cpRecoEngine; //语音识别引擎
 int speak(wchar_t *str);

 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
 {
	 HWND        hwnd;
	 MSG         msg;
	 WNDCLASS    wndclass;

	 wndclass.cbClsExtra          =0;
	 wndclass.cbWndExtra          =0;
	 wndclass.hbrBackground       =(HBRUSH)GetStockObject(WHITE_BRUSH);
	 wndclass.hCursor             =LoadCursor(NULL,IDC_ARROW);
	 wndclass.hIcon               =LoadIcon(NULL,IDI_APPLICATION);
	 wndclass.hInstance           =hInstance;
	 wndclass.lpfnWndProc         =WndProc;
	 wndclass.lpszClassName       =szAppName;
	 wndclass.lpszMenuName        =NULL;
	 wndclass.style               =CS_HREDRAW|CS_VREDRAW;

	 if(!RegisterClass(&wndclass))
	 {
		 MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
		 return 0;
	 }
	 speak(L"谭胜是一个猥琐男");

	 hwnd=CreateWindow(szAppName,
		               TEXT("传智播客C/C++学院语音识别教程"),
					   WS_OVERLAPPEDWINDOW,
					   CW_USEDEFAULT,
					   CW_USEDEFAULT,
					   CW_USEDEFAULT,
					   CW_USEDEFAULT,
					   NULL,
					   NULL,
					   hInstance,
					   NULL);

	 ShowWindow(hwnd,iCmdShow);
	 UpdateWindow(hwnd);
	 
	 while(GetMessage(&msg,NULL,0,0))
	 {
		 TranslateMessage(&msg);
		 DispatchMessage(&msg);
	 }
	
	 return msg.wParam;
 }

 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
 {
	 HDC           hdc;
	 PAINTSTRUCT   ps;

	 switch(message)
	 {
	 case WM_CREATE:
		 {
			 //初始化COM端口
			 ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
			 //创建识别引擎COM实例为共享型
			 HRESULT hr=m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
			 //创建识别上下文接口
			 if(SUCCEEDED(hr))
			 {
				 hr=m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);
			 }
			 else MessageBox(hwnd,TEXT("error1"),TEXT("error"),S_OK);
			 //设置识别消息,使计算机时刻监听语音消息
			 if(SUCCEEDED(hr))
			 {
				 hr=m_cpRecoCtxt->SetNotifyWindowMessage(hwnd,WM_RECOEVENT,0,0);
			 }
			 else MessageBox(hwnd,TEXT("error2"),TEXT("error"),S_OK);
			 //设置我们感兴趣的事件
			 if(SUCCEEDED(hr))
			 {
				 ULONGLONG ullMyEvents=SPFEI(SPEI_SOUND_START)|SPFEI(SPEI_RECOGNITION)|SPFEI(SPEI_SOUND_END);
				 hr=m_cpRecoCtxt->SetInterest(ullMyEvents,ullMyEvents);
			 }
			 else MessageBox(hwnd,TEXT("error3"),TEXT("error"),S_OK);
			 //创建语法规则
			 b_Cmd_Grammar=TRUE;
			 if(FAILED(hr))
			 {
				 MessageBox(hwnd,TEXT("error4"),TEXT("error"),S_OK);
			 }
			 hr=m_cpRecoCtxt->CreateGrammar(GID_CMD_GR,&m_cpCmdGramma);
			 WCHAR wszXMLFile[20]=L"er.xml";
			 MultiByteToWideChar(CP_ACP,0,(LPCSTR)"er.xml",-1,wszXMLFile,256);
			 hr=m_cpCmdGramma->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC);
			 if(FAILED(hr))
			 {
				 MessageBox(hwnd,TEXT("error5"),TEXT("error"),S_OK);
			 }
			 b_initSR=TRUE;
			 //在开始识别时,激活语法进行识别
		     hr=m_cpCmdGramma->SetRuleState(NULL,NULL,SPRS_ACTIVE);
	    	 return 0;
		 }
	 case WM_RECOEVENT:
		 {
			 RECT rect;
             GetClientRect(hwnd,&rect);
             hdc=GetDC(hwnd);
			 USES_CONVERSION;
			 CSpEvent event;
			 while(event.GetFrom(m_cpRecoCtxt)==S_OK)
			 {
			     switch(event.eEventId)
			     {
			     case SPEI_RECOGNITION:
    				 {
            			 static const WCHAR wszUnrecognized[]=L"<Unrecognized>";
		            	 CSpDynamicString dstrText;
			    		 //取得识别结果
				    	 if(FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,TRUE,&dstrText,NULL)))
					     {
						     dstrText=wszUnrecognized;
    					 }
        	    		 BSTR SRout;
	        	    	 dstrText.CopyToBSTR(&SRout);
						 char* lpszText2 = _com_util::ConvertBSTRToString(SRout);

			    		 if(b_Cmd_Grammar)
				    	 {
							 //绘制文本
							 DrawText(hdc, TEXT(lpszText2), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);													 
							 if (strcmp("我是学霸",lpszText2)==0)
	    				     {    
								MessageBoxA(0, lpszText2, lpszText2, 0);
					         }
							 if (strcmp("清华土匪", lpszText2) == 0)
							 {
								 MessageBoxA(0, lpszText2, lpszText2, 0);
							 }
							 if (strcmp("传智播客", lpszText2) == 0)
							 {
								 MessageBoxA(0, lpszText2, lpszText2, 0);
							 }
							 if (strcmp("天下无双", lpszText2) == 0)
							 {
								 wchar_t * str = L"谭胜大爷吹牛皮的功夫天下无双";
								 speak(str);
							 }
							 if (strcmp("给我上", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 shang();
							 }
							 if (strcmp("给我下", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 xia();
							 }
							 if (strcmp("给我左", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 zuo();
							 }
							 if (strcmp("给我右", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 you();
							 }
							 if (strcmp("打开企鹅", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 openqq();
							 }
							 if (strcmp("关闭企鹅", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 closeqq();
							 }
							 if (strcmp("显示", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 show();
							 }
							 if (strcmp("隐藏", lpszText2) == 0)
							 {
								 speak(L"亲爱的主人,好");
								 hide();
							 }
							 if (strcmp("谭胜是谁", lpszText2) == 0)
							 {
								 speak(L"谭胜是横空出世的英雄,百年不遇的天才");
							 }
							 if (strcmp("你是谁", lpszText2) == 0)
							 {
								 speak(L"我是你们勇猛勤奋彪悍的谭胜大哥写的语音识别程序");
							 }

							 if (strcmp("你是笨蛋", lpszText2) == 0)
							 {
								 speak(L"我的创造者谭胜大哥聪明的惊天地泣鬼神");
							 }
							 if (strcmp("你是蠢猪", lpszText2) == 0)
							 {
								 speak(L"我固然很蠢,但是我的创造者谭胜大哥聪明的惊天地泣鬼神");
							 }
							 if (strcmp("你很好", lpszText2) == 0)
							 {
								 speak(L"我一直很牛逼,多亏谭大爷");
							 }
							 if (strcmp("中秋快乐", lpszText2) == 0)
							 {
								 speak(L"谭大爷叫你回家吃月饼");
							 }

						
    					 }    
        			 }
	    		 }
			 }
			 return TRUE;
		 }
	 case WM_PAINT:
		 hdc=BeginPaint(hwnd,&ps);
		 EndPaint(hwnd,&ps);
		 return 0;
	 case WM_DESTROY:
		 PostQuitMessage(0);
		 return 0;
	 }
	 return DefWindowProc(hwnd,message,wParam,lParam);
 }

#pragma comment(lib, "ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll   
int speak(wchar_t *str)
{
	 ISpVoice * pVoice = NULL;
	 ::CoInitialize(NULL);
	 //获取ISpVoice接口:   
	 long hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
	 hr = pVoice->Speak(str, 0, NULL);
	 pVoice->Release();
	 pVoice = NULL;
	 //千万不要忘记:   
	 ::CoUninitialize();
	 return TRUE;
 }





void openqq()
{
	ShellExecuteA(0, "open", "\"C:\\Program Files (x86)\\Tencent\\QQ\\QQProtect\\Bin\\QQProtect.exe\"", 0, 0, 1);
}

void closeqq()
{
	system("taskkill /f /im QQ.exe");
}

void show()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		ShowWindow(win, SW_SHOW);
	}
}

void  hide()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		ShowWindow(win, SW_HIDE);
	}
}


void  shang()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left, rectwind.top - 100, 300, 300, 1);
	}
}

void xia()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left, rectwind.top + 100, 300, 300, 1);
	}
}

void zuo()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left - 100, rectwind.top, 300, 300, 1);
	}
}

void you()
{
	HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
	if (win != NULL)
	{
		RECT rectwind;//区域,lefr ,right ,top,bottom
		GetWindowRect(win, &rectwind);//获取区域
		SetWindowPos(win, NULL, rectwind.left + 100, rectwind.top, 300, 300, 1);//设置区域位置
	}
}

er.xml

<?xml version="1.0" encoding="utf-8"?>
<GRAMMAR LANGID="804">
  <DEFINE>
    <ID NAME="CMD" VAL="10"/>
    </DEFINE>
  <RULE NAME="COMMAND" ID="CMD" TOPLEVEL="ACTIVE">
    <L>
      <P>我是学霸</P>
      <P>清华土匪</P>
      <P>传智播客</P>
      <P>天下无双</P>
      <P>给我上</P>我
      <P>给我下</P>
      <P>给我左</P>
      <P>给我右</P>
      <P>打开企鹅</P>
      <P>关闭企鹅</P>
      <P>显示</P>
      <P>隐藏</P>
      <P>谭胜是谁</P>
      <P>你是谁</P>
      <P>你是笨蛋</P>
      <P>你是蠢猪</P>
      <P>你很好</P>
      <P>中秋快乐</P>
      </L>
    </RULE>
  </GRAMMAR>

语音控制游戏

#include <windows.h>
#include <atlstr.h>
#include <sphelper.h>
#include <sapi.h>
#include<comutil.h>
#include<string.h>


#pragma comment(lib,"sapi.lib")
#pragma comment(lib, "comsupp.lib") 

#define GID_CMD_GR 333333
#define WM_RECOEVENT WM_USER+1

 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

 char 	 szAppName[] = "TsinghuaYincheng";
 BOOL b_initSR;
 BOOL b_Cmd_Grammar;
 CComPtr<ISpRecoContext>m_cpRecoCtxt;  //语音识别程序接口
 CComPtr<ISpRecoGrammar>m_cpCmdGramma; //识别语法
 CComPtr<ISpRecognizer>m_cpRecoEngine; //语音识别引擎
 int speak(wchar_t *str);

 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
 {
	 HWND        hwnd;
	 MSG         msg;
	 WNDCLASS    wndclass;

	 wndclass.cbClsExtra          =0;
	 wndclass.cbWndExtra          =0;
	 wndclass.hbrBackground       =(HBRUSH)GetStockObject(WHITE_BRUSH);
	 wndclass.hCursor             =LoadCursor(NULL,IDC_ARROW);
	 wndclass.hIcon               =LoadIcon(NULL,IDI_APPLICATION);
	 wndclass.hInstance           =hInstance;
	 wndclass.lpfnWndProc         =WndProc;
	 wndclass.lpszClassName       =szAppName;
	 wndclass.lpszMenuName        =NULL;
	 wndclass.style               =CS_HREDRAW|CS_VREDRAW;

	 if(!RegisterClass(&wndclass))
	 {
		 MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
		 return 0;
	 }
	 speak(L"谭胜是一个猥琐男");

	 hwnd=CreateWindow(szAppName,
		               TEXT("传智播客C/C++学院语音识别教程"),
					   WS_OVERLAPPEDWINDOW,
					   CW_USEDEFAULT,
					   CW_USEDEFAULT,
					   CW_USEDEFAULT,
					   CW_USEDEFAULT,
					   NULL,
					   NULL,
					   hInstance,
					   NULL);

	 ShowWindow(hwnd,iCmdShow);
	 UpdateWindow(hwnd);
	 
	 while(GetMessage(&msg,NULL,0,0))
	 {
		 TranslateMessage(&msg);
		 DispatchMessage(&msg);
	 }
	
	 return msg.wParam;
 }

 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
 {
	 HDC           hdc;
	 PAINTSTRUCT   ps;

	 switch(message)
	 {
	 case WM_CREATE:
		 {
			 //初始化COM端口
			 ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
			 //创建识别引擎COM实例为共享型
			 HRESULT hr=m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
			 //创建识别上下文接口
			 if(SUCCEEDED(hr))
			 {
				 hr=m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);
			 }
			 else MessageBox(hwnd,TEXT("error1"),TEXT("error"),S_OK);
			 //设置识别消息,使计算机时刻监听语音消息
			 if(SUCCEEDED(hr))
			 {
				 hr=m_cpRecoCtxt->SetNotifyWindowMessage(hwnd,WM_RECOEVENT,0,0);
			 }
			 else MessageBox(hwnd,TEXT("error2"),TEXT("error"),S_OK);
			 //设置我们感兴趣的事件
			 if(SUCCEEDED(hr))
			 {
				 ULONGLONG ullMyEvents=SPFEI(SPEI_SOUND_START)|SPFEI(SPEI_RECOGNITION)|SPFEI(SPEI_SOUND_END);
				 hr=m_cpRecoCtxt->SetInterest(ullMyEvents,ullMyEvents);
			 }
			 else MessageBox(hwnd,TEXT("error3"),TEXT("error"),S_OK);
			 //创建语法规则
			 b_Cmd_Grammar=TRUE;
			 if(FAILED(hr))
			 {
				 MessageBox(hwnd,TEXT("error4"),TEXT("error"),S_OK);
			 }
			 hr=m_cpRecoCtxt->CreateGrammar(GID_CMD_GR,&m_cpCmdGramma);
			 WCHAR wszXMLFile[20]=L"er.xml";
			 MultiByteToWideChar(CP_ACP,0,(LPCSTR)"er.xml",-1,wszXMLFile,256);
			 hr=m_cpCmdGramma->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC);
			 if(FAILED(hr))
			 {
				 MessageBox(hwnd,TEXT("error5"),TEXT("error"),S_OK);
			 }
			 b_initSR=TRUE;
			 //在开始识别时,激活语法进行识别
		     hr=m_cpCmdGramma->SetRuleState(NULL,NULL,SPRS_ACTIVE);
	    	 return 0;
		 }
	 case WM_RECOEVENT:
		 {
			 RECT rect;
             GetClientRect(hwnd,&rect);
             hdc=GetDC(hwnd);
			 USES_CONVERSION;
			 CSpEvent event;
			 while(event.GetFrom(m_cpRecoCtxt)==S_OK)
			 {
			     switch(event.eEventId)
			     {
			     case SPEI_RECOGNITION:
    				 {
            			 static const WCHAR wszUnrecognized[]=L"<Unrecognized>";
		            	 CSpDynamicString dstrText;
			    		 //取得识别结果
				    	 if(FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,TRUE,&dstrText,NULL)))
					     {
						     dstrText=wszUnrecognized;
    					 }
        	    		 BSTR SRout;
	        	    	 dstrText.CopyToBSTR(&SRout);
						 char* lpszText2 = _com_util::ConvertBSTRToString(SRout);

			    		 if(b_Cmd_Grammar)
				    	 {
							 DrawText(hdc, TEXT(lpszText2), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
							 if (strcmp("旋风刀",lpszText2)==0)
	    				     {    
								 keybd_event('A', 0, 0, 0);//按下
								 keybd_event('A', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event('D', 0, 0, 0);//按下
								 keybd_event('D', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event('W', 0, 0, 0);//按下
								 keybd_event('W', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
								 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

				        		
					         }
							 if (strcmp("大风吹", lpszText2) == 0)
							 {
								 //sww l
								 keybd_event('A', 0, 0, 0);//按下
								 keybd_event('A', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event('D', 0, 0, 0);//按下
								 keybd_event('D', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event('S', 0, 0, 0);//按下
								 keybd_event('S', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
								 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
								 
							 }
							 if (strcmp("充气", lpszText2) == 0)
							 {
								 //   \ang
								 keybd_event(VK_OEM_102, 0, 0, 0);//按下
								 keybd_event(VK_OEM_102, 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event('A', 0, 0, 0);//按下
								 keybd_event('A', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event('N', 0, 0, 0);//按下
								 keybd_event('N', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event('G', 0, 0, 0);//按下6igrk;)移植
								 keybd_event('G', 0, KEYEVENTF_KEYUP, 0);//弹起
								 Sleep(10);
								 keybd_event(VK_RETURN, 0, 0, 0);//按下6igrk;)移植
								 keybd_event(VK_RETURN,  0, KEYEVENTF_KEYUP, 0);//弹起

							
							 }
							 if (strcmp("跳跃", lpszText2) == 0)
							 {

								 keybd_event(VK_SPACE, 0, 0, 0);//按下
								 keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);//弹起


							 }
							 if (strcmp("趴下", lpszText2) == 0)
							 {


							 }
							 if (strcmp("前进", lpszText2) == 0)
							 {


							 }
							 if (strcmp("后退", lpszText2) == 0)
							 {


							 }
						
    					 }    
        			 }
	    		 }
			 }
			 return TRUE;
		 }
	 case WM_PAINT:
		 hdc=BeginPaint(hwnd,&ps);
		 EndPaint(hwnd,&ps);
		 return 0;
	 case WM_DESTROY:
		 PostQuitMessage(0);
		 return 0;
	 }
	 return DefWindowProc(hwnd,message,wParam,lParam);
 }

#pragma comment(lib, "ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll   
int speak(wchar_t *str)
{
	 ISpVoice * pVoice = NULL;
	 ::CoInitialize(NULL);
	 //获取ISpVoice接口:   
	 long hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
	 hr = pVoice->Speak(str, 0, NULL);
	 pVoice->Release();
	 pVoice = NULL;
	 //千万不要忘记:   
	 ::CoUninitialize();
	 return TRUE;
 }

er.xml与cpp文件放在同一目录下

<?xml version="1.0" encoding="utf-8"?>
<GRAMMAR LANGID="804">
  <DEFINE>
    <ID NAME="CMD" VAL="10"/>
    </DEFINE>
  <RULE NAME="COMMAND" ID="CMD" TOPLEVEL="ACTIVE">
    <L>
      <P>旋风刀</P>
      <P>大风吹</P>
      <P>充气</P>
      <P>跳跃</P>
      <P>趴下</P>
      <P>前进</P>
      <P>后退</P>
      </L>
    </RULE>
  </GRAMMAR>




语音识别控制游戏

阅读数 130

百度语音识别

阅读数 20

没有更多推荐了,返回首页