2018-12-25 15:22:00 weixin_30709635 阅读数 46
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1104 人正在学习 去看看 耿职

百度云语音识别接口使用:


百度云语音识别接口文档:https://cloud.baidu.com/doc/SPEECH/ASR-API.html#JSON.E6.96.B9.E5.BC.8F.E4.B8.8A.E4.BC.A0

一. 解析用户语音输入,转换为字符串

  • 捕获用户的语音输入
    • windows安装
    1. pip3 install PyAudio   #如果报错可以尝试2,3步骤 丶 如果用pip3下载安装报错可以在python第三方安装包下载地址搜索下载安装https://pypi.org/ 
    2. python -m pip install --upgrade pip
    3. pip install PyAudio
    • CentOS 7.4 下安装PyAudio 需要先安装 portaudio (采用的方法,可行)

      1、在安装pyaudio时,报错failed error: portaudio.h: 没有那个文件或目录

      2、pyaudio的运行需要依赖于portaudio这个库,应该先安装一个portaudio库

      3、portaudio安装步骤:

        a)下载portaudio库http://portaudio.com/download.html

        b)将下载的文件进行解压

        c)进入解压后的portaudio文件,依次执行命令:

          ./configure

          make

          make install

        d)进入~/.bashrc文件:vim ~/.bashrc

          在文件最后一行加入  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

          然后执行命令source ~/.bashrc

      4、到此portaudio库安装成功

      5、安装pyaudio库,pip3 install pyaudio (wget https://files.pythonhosted.org/packages/ab/42/b4f04721c5c5bfc196ce156b3c768998ef8c0ae3654ed29ea5020c749a6b/PyAudio-0.2.11.tar.gz)

       成功后显示版本为0.2.11

二,音频数据给到百度云

  • 音频数据的格式规则  
    • format:格式  wav
    • rate:采样率  16000
    • channel:声道  1单声道
    • cuid:用户ID  MAC地址,只要保证唯一
    • token:身份识别  在百度云接口平台注册后,才能拿到
    • dev_pid:  1536英文,1537中文
    • len:数据的长度 原始的  len(data) ->
    • speech:数据对象  
        1,base64 编码
        2,经常用于网络中的音频图像二进制的数据传输
        3,base64.b64encode(data)
  • **JSON**格式POST上传本地音频流数据
  • header:Content-Type:application/json
    • 标识,
    • GET:直接获取服务器上的数据
    • POST:客户端先向服务端提交数据,服务端在返回,POST一定会向服务器提交数据
  • RESTFUL:资源定义成了连接(url 同一资源,这个要了解一下)
    • 连接,www.baidu.com
    • POST提交数据,
    • WEB服务 HTTP协议
    • RESTFUL:ip/?shutdown   #关机命令

 

  • http://vop.baidu.com/server_api        #百度云api接口地址,我们的语音信息提交到这个接口就行了

 

三,捕获百度云返回的结果

  • JSON的返回    #无论什么方式上传都会以JSON格式返回结果
    • json.loads() 解析json数据变为Python中数据对象 字典
    • j'son.dumps() dict -> dict
  • result   #音频返回的结果在result字段中
四,接口使用:
  • PyAudio:对象,实例化一个设备
  • pa.open(format=存储位深 int 16位, channels=声道,rate=采样率,input=True,frame_per_buffer=1024)
五,注册登录百度云管理中心创建任务         ### https://console.bce.baidu.com/ai/?_=1545815700081#/ai/speech/app/create
 六,代码编写如下:
import time
from pyaudio import PyAudio,paInt16
from urllib.request import urlopen,Request    #专门处理http协议的模块
import json
import base64
def play_audio(data): #播放音频
	pa = PyAudio() #设备实例化
	equip = pa.open(
		format=paInt16,
		channels=1, #单声道
		rate=16000,
		output=True,
	) #打开设备,并且支持输出
	equip.write(data) #设备的write函数,写入音频数据
	equip.stop_stream() #关闭写入
	equip.close()
	pa.terminate() #关闭设备实例
def record_audio():  #输入音频
	pa = PyAudio() #设备实例化
	equip = pa.open(
		format=paInt16,
		channels=1,
		rate=16000,
		input=True,
		frames_per_buffer=1024,
	) #打开设备,并且支持输入
	data = [] #存储未来的语音输入
		#一截一截的语音数据  [b'1',b'2',]
	times = 0 #用来控制用户输入语音长度的
	start = time.time()
	while times < 50: #3S
		data.append(equip.read(1024)) #读取设备中此时的语音数据
		times += 1
	end = time.time()
	print('[TALK] %.2f' % (end - start)) #%.2f 保留2位小数点有效位数字
	data = b''.join(data) #完整的音频流数据
	equip.close()
	pa.terminate() #关闭设备实例
	return data
def baidu_token():
	API_Key = 'oAcBP47GDDpj6XIHWmcSkeRi'
	Secret_Key = 'ba2EKROswCy6KXzLdTpnGqPnPhHSFHU7'
	grant_type = 'client_credentials'
	url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=%s&client_id=%s&client_secret=%s'
	response = json.loads(urlopen(url % (grant_type,API_Key,Secret_Key)).read().decode())
	access_token = response['access_token']
	return access_token
def baidu_fenxi(data):
	url = 'http://vop.baidu.com/server_api'
	data_len = len(data)
	audio_data = base64.b64encode(data).decode() 
	access_token = baidu_token()
	post_data = json.dumps({
	    "format":"wav",
	    "rate":16000,
        "dev_pid":1536,
        "channel":1,
        "token":access_token,
        "cuid":"00-50-56-C0-00-08",
        "len":data_len,
        "speech":audio_data,
    }).encode() #变为json的二进制
	headers = {'Content-Type':'application/json'}
	req = Request(url=url,headers=headers,data=post_data)
	result = json.loads(urlopen(req).read().decode()).get('result')
	if result:
		return result[0]
	else:
		return None
def main():
	data = record_audio()
	res = baidu_fenxi(data)
	print(res)
if __name__ == '__main__':
	#程序入口
	main()
运行结果:
E:\python学习资料\上课代码编写\代码练习py>python e:/python学习资料/上课代码编写/代码练习py/百度云.py
[TALK] 3.21
你好  
 
 
 
 

转载于:https://www.cnblogs.com/zhangan/p/10174167.html

2019-08-20 22:57:48 zhangyuandilove 阅读数 504
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1104 人正在学习 去看看 耿职

百度语音权限token获取地址:https://openapi.baidu.com/oauth/2.0/token

百度语音识别接口地址:http://vop.baidu.com/server_api

按照官方Api指导,第一步获取token,采用post请求方式,js代码如下:

var token;
function getToken() {
	$.post("https://openapi.baidu.com/oauth/2.0/token", {
		grant_type: 'client_credentials',
		client_id: '个人应用的clientid',//需要替换
		client_secret: '对应应用的加密串'//需要替换
	}, function(result) {
		token = result.access_token;
	}, "json")
}

token获取后,先放一边,我们进行页面语音的录制并播放。

var mediaRecorder;
	var voiceMsg = $("#voice-rec");//按钮,按住说话,放开进行语音识别
		voiceMsg.on('touchstart', function(ev) {
			$(this).html('松开 结束');
			$(this).addClass("activeBtn");
			$('#voiceInputLoading').show();
			setTimeout(function() {
				mediaRecorder.stop();
			}, 10000)
			mediaRecorder.record({
				samplerate: "16000",
				format: "amr",
				filename: "_doc/audio/"
			}, function(e) {
				plus.io.resolveLocalFileSystemURL(e, function(entry) {
					entry.file(function(file) {
						let reader = null;
						let size = file.size;
						reader = new plus.io.FileReader();
						reader.onload = function(e) {};
						reader.readAsDataURL(file);
						reader.onloadend = function(e) {
							var urlStr = e.target.result;
                            //注意以下字符截取,关键部分
							urlArr = urlStr.split(",")[1];
							//调用百度API进行语音识别
							getVoice2Text(urlArr, size, function(msg) {
								console.log(msg);
							});
						}
					})
				});
			}, function(e) {
				alert("Audio record failed: " + e.message);
			});
		});
		voiceMsg.on('touchend', function(ev) {
			$(this).html('按下 说话');
			$(this).removeClass("activeBtn");
			$('#voiceInputLoading').hide();
			mediaRecorder.stop();
		});

以上代码中getVoice2Text这个方法就是调用百度语音识别Api

function getVoice2Text(base64, urlSize,callback) {
	$.ajax({
		type: "post",
		url: "http://vop.baidu.com/server_api",
		async: true,
		contentType: "application/json",
		processData: false,
		data: JSON.stringify({
			"format": "amr", 
			"rate": 16000, 
			"dev_pid": 1536, 
			"channel": 1, 
			"cuid": "862245234377502,862989243244150", //设备的唯一id
			"speech": base64, 
			"len": urlSize, 
			"token": token//第一步获取到的token
		}),
		success: function(data) {
			console.log(data.result[0]);
			callback(data.result[0]);
		}
	});

}

这里需要注意一下的地方就是以下两点:

1:音频采用的是plus.audio提供的api;

2:音频文件转换采用的是plus.io提供的api

感兴趣的朋友可以参考:http://www.html5plus.org/doc/zh_cn/webview.html

2019-02-27 10:24:37 zz_hh_uu_ 阅读数 1431
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1104 人正在学习 去看看 耿职
  1. 首先在腾讯ai开放平台注册,依次找到技术引擎->语音识别,选择语音识别一栏,在技术文档里左侧的新手指南下载python版本的SDK.同时在免费试用的接入能力中,创建应用,并得到app_key和app_id,修改test_aai_wxasrs.py
#-*- coding: UTF-8 -*-
import sys
import os
import optparse
import time
import apiutil
import base64
import json
import hashlib
import time
import glob
import codecs

app_key = ''#填入申请的app_key
app_id = '‘#填入申请的app_id

if __name__ == '__main__':
    wav_files = glob.glob(u'''./tools/TX_aiplat/audio/*.wav''')
    count = 1
    for wav_file in wav_files:
        if not os.path.exists(wav_file[:-3] + "trn"):
            seq = 0
            for_mat = 2
            rate = 16000
            bits = 16
            cont_res = 1                
            file_path = wav_file
            f = open(file_path, 'r')
            md5obj = hashlib.md5()  
            md5obj.update(f.read())  
            hash = md5obj.hexdigest()  
            speech_id = str(hash).upper() 
            f.close()
            f = open(file_path, 'rb')
            file_size = os.path.getsize(file_path)
            try:
                    chunk = f.read()
                    if not chunk:
                        pass
                        #break
                    else:
                        chunk_size = len(chunk)
                        if (seq + chunk_size) == file_size:
                            end = 1
                        else:
                            end = 0
                    ai_obj = apiutil.AiPlat(app_id, app_key)
                    print '----------------------SEND REQ----------------------'
                    rsp = ai_obj.getAaiWxAsrs(chunk, speech_id, end, for_mat, rate, bits, seq, chunk_size, cont_res)
                    seq += chunk_size
                    print rsp
                    if rsp['ret'] == 0:
                        results = json.dumps(rsp, encoding="UTF-8", ensure_ascii=False, sort_keys=False, indent=4)
                        results =  json.loads(results)
                        if results['data']['speech_text'] != u'':
                            print wav_file
                            trn_file = wav_file[:-3] + "trn"
                            with codecs.open(trn_file,'w','utf-8') as wp:
                                wp.write(results['data']['speech_text'])
                                count = count + 1
                            print u'''处理第%d个音频:%s''' %(count,wav_file)
                            print '----------------------API SUCC----------------------'
                            #time.sleep(1)
                        else:
                            os.remove(wav_file)
                    else:
                        print json.dumps(rsp, encoding="UTF-8", ensure_ascii=False, sort_keys=False, indent=4)
                        print '----------------------API FAIL----------------------'
            except:
                f.close()
                continue
2018-08-22 17:24:55 yuanlulu 阅读数 10232
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1104 人正在学习 去看看 耿职

概述

目前市场上有很多家的语音识别接口可用,简单测试都不要钱。国内的BAT和科大讯飞,国外的微软和谷歌都提供了中文的语音识别接口,既有sdk又有webAPI。我的测试都是在python3环境下进行的。

最终选择百度和科大讯飞的接口。主要是考虑中文识别应该国内厂商做的更好。

免费试用阶段,科大讯飞每天限定500次调用。百度则只限制每秒20次,总次数没限制。

试用下来的感觉就是,科大讯飞的接口更快,断句什么的也更好。但是试用次数少是个问题,只能评估玩玩。

科大讯飞语音识别webAPI

使用之前需要先去https://xfyun.cn注册并创建应用。获得APPID和APPkey.

官方的webAPI接口文档在:https://doc.xfyun.cn/rest_api/%E8%AF%AD%E9%9F%B3%E5%90%AC%E5%86%99.html

代码是官网上的,但是那是个python2上的,我改成python3版本了(python3对于参数的编码格式更严格)。

注意:将脚本中 AUDIO_PATH, API_KEY, APPID, 换成相应的音频路径,讯飞开放平台提供的 apiKey,讯飞开放平台应用的 appid 即可。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
import time
import urllib
import json
import hashlib
import base64
from urllib import parse

def main():
    f = open("AUDIO_PATH", 'rb')
    file_content = f.read()
    base64_audio = base64.b64encode(file_content)
    body = parse.urlencode({'audio': base64_audio})

    url = 'http://api.xfyun.cn/v1/service/v1/iat'
    api_key = 'API_KEY'
    param = {"engine_type":"sms16k","aue":"raw"}

    x_appid = 'APPID'
    json_str = json.dumps(param).replace(' ', '')
    print('json_str:{}'.format(json_str))
    x_param = base64.b64encode(bytes(json_str, 'ascii'))
    x_time = int(int(round(time.time() * 1000)) / 1000)
    x_checksum_str = api_key + str( x_time ) + str(x_param)[2:-1]
    print('x_checksum_str:[{}]'.format(x_checksum_str))
    x_checksum = hashlib.md5(x_checksum_str.encode(encoding='ascii')).hexdigest()
    print('x_checksum:{}'.format(x_checksum))
    x_header = {'X-Appid': x_appid,
                'X-CurTime': x_time,
                'X-Param': x_param,
                'X-CheckSum': x_checksum}

    start_time = time.time()
    req = urllib.request.Request(url, bytes(body, 'ascii'), x_header)
    result = urllib.request.urlopen(req)
    result = result.read()
    print( "used time: {}s".format( round( time.time() - start_time, 2 ) ) )
    print('result:'+str(result.decode(encoding='UTF8')))
    return

if __name__ == '__main__':
    main() 

我的一个测试输出:

json_str:{"engine_type":"sms16k","aue":"raw"}

used time: 0.82s
result:{"code":"0","data":"特别是跨省区电网超计划用电,不仅损害自己,也损害别人,损害电网,损害国家。","desc":"success","sid":"zat006392f7@ch6b010ed8627f3d3700"}

一个注意点

如果没有把ip放到白名单中,就会返回以下错误信息,错误码是10105

al access|illegal client_ip:xxxxx

在‘控制台->我的应用’里把信息里的IP加上就行。

百度语音识别webAPI

需要先在百度云上注册:https://cloud.baidu.com/

然后在管理控制台上创建一个语音识别应用,你会得到AppId\AppKey\SecretKey等信息,这些需要在调用接口的时候用到。

百度的python接口用起来比较简单,先pip install baidu-aip即可。
具体文档参考:https://cloud.baidu.com/doc/SPEECH/ASR-Online-Python-SDK.html#.E9.85.8D.E7.BD.AEAipSpeech

参考官方例子,我的代码如下(注意替换自己的APP_ID、API_KEY、SECRET_KEY):

from aip import AipSpeech
import time

APP_ID = 'APP_ID'
API_KEY = 'API_KEY'
SECRET_KEY = 'SECRET_KEY'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 识别本地文件
start_time = time.time()
ret = client.asr(get_file_content('./aideo_files/A2_58.wav'), 'pcm', 16000, {
    'dev_pid': 1537,
})
used_time = time.time() - start_time

print( "used time: {}s".format( round( time.time() - start_time, 2 ) ) )
print('ret:{}'.format(ret))

我测试的输出结果为:

used time: 8.18s
ret:{'corpus_no': '6592465378279780417', 'err_msg': 'success.', 'err_no': 0, 'result':
['特别是跨省区电网超计划用电,不仅损害自己也损害别人损害电网损害国家,'], 'sn': '148955205071534927957'}

时间上比科大讯飞长了好几倍,断句也不是很好。胜在试用次数基本不限。

小结

比较 优点 缺点
百度 试用次数多 速度慢,断句不太好
科大讯飞 速度快,断句好 试用次数有限

今天测试比较简单,等后面大规模测试了再来补充。

2016-05-04 19:38:56 MichaelLiang12 阅读数 18663
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1104 人正在学习 去看看 耿职

C++语音识别接口快速入门(Microsoft Speech SDK)

最近毕业设计用到了微软的C++语音识别接口,查找了很多资料,也碰到了很多问题,走了很多弯路。现在把我自己的经验写下来,一是提升自己,二是回报社会。希望大家看了这篇blog之后,5min就学会C++语音识别接口的实现。(采用的平台为win8+VS2013)

目录

一、安装SDK

安装MicrosoftSpeechPlatformSDK.msi,默认路径安装即可。
下载路径:
http://download.csdn.net/detail/michaelliang12/9510691

二、新建工程,配置环境

设置:
1,属性–配置属性–C/C++–常规–附加包含目录:C:\Program Files\Microsoft SDKs\Speech\v11.0\Include(具体路径与安装路径有关)
2,属性–配置属性–链接器–输入–附加依赖项:sapi.lib;

三、语音识别代码

语音识别接口可分为文字转语音和语音转文字

1、文字转语音

需要添加的头文件:

#include <sapi.h> //导入语音头文件
#pragma comment(lib,"sapi.lib") //导入语音头文件库

函数:

void  CBodyBasics::MSSSpeak(LPCTSTR speakContent)// speakContent为LPCTSTR型的字符串,调用此函数即可将文字转为语音
{
    ISpVoice *pVoice = NULL;

    //初始化COM接口

    if (FAILED(::CoInitialize(NULL)))
        MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);

    //获取SpVoice接口

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);


    if (SUCCEEDED(hr))
    {
        pVoice->SetVolume((USHORT)100); //设置音量,范围是 0 -100
        pVoice->SetRate(2); //设置速度,范围是 -10 - 10
        hr = pVoice->Speak(speakContent, 0, NULL);

        pVoice->Release();

        pVoice = NULL;
    }

    //释放com资源
    ::CoUninitialize();
}

2、语音转文字

这个稍微麻烦一点,因为需要实时监控麦克风,涉及到windows的消息机制。
(1)首先设置工程属性:
属性–配置属性–C/C++–预处理器–预处理器定义:_WIN32_DCOM;

(2)需要添加的头文件:

#include <sapi.h> //导入语音头文件
#pragma comment(lib,"sapi.lib") //导入语音头文件库
#include <sphelper.h>//语音识别头文件
#include <atlstr.h>//要用到CString

#pragma once
const int WM_RECORD = WM_USER + 100;//定义消息

(3)在程序的.h头文件中定义变量

//定义变量
CComPtr<ISpRecognizer>m_cpRecoEngine;// 语音识别引擎(recognition)的接口。
CComPtr<ISpRecoContext>m_cpRecoCtxt;// 识别引擎上下文(context)的接口。
CComPtr<ISpRecoGrammar>m_cpCmdGrammar;// 识别文法(grammar)的接口。
CComPtr<ISpStream>m_cpInputStream;// 流()的接口。
CComPtr<ISpObjectToken>m_cpToken;// 语音特征的(token)接口。
CComPtr<ISpAudio>m_cpAudio;// 音频(Audio)的接口。(用来保存原来默认的输入流)
ULONGLONG  ullGrammerID;

(4)创建语音识别初始化函数(程序刚开始执行的时候调用,例如文末示例代码中,将此初始化函数放在对话框初始化消息WM_INITDIALOG的响应代码里)

//语音识别初始化函数
void  CBodyBasics::MSSListen()
{

    //初始化COM接口

    if (FAILED(::CoInitialize(NULL)))
        MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);


    HRESULT hr = m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);//创建Share型识别引擎
    if (SUCCEEDED(hr))
    {


        hr = m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);//创建识别上下文接口

        hr = m_cpRecoCtxt->SetNotifyWindowMessage(m_hWnd, WM_RECORD, 0, 0);//设置识别消息

        const ULONGLONG ullInterest = SPFEI(SPEI_SOUND_START) | SPFEI(SPEI_SOUND_END) | SPFEI(SPEI_RECOGNITION);//设置我们感兴趣的事件
        hr = m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);

        hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &m_cpAudio);
        m_cpRecoEngine->SetInput(m_cpAudio, true);



        //创建语法规则
        //dictation听说式
        //hr = m_cpRecoCtxt->CreateGrammar(GIDDICTATION, &m_cpDictationGrammar);
        //if (SUCCEEDED(hr))
        //{
        //  hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);//加载词典
        //}

        //C&C命令式,此时语法文件使用xml格式
        ullGrammerID = 1000;
        hr = m_cpRecoCtxt->CreateGrammar(ullGrammerID, &m_cpCmdGrammar);

        WCHAR wszXMLFile[20] = L"";//加载语法
        MultiByteToWideChar(CP_ACP, 0, (LPCSTR)"CmdCtrl.xml", -1, wszXMLFile, 256);//ANSI转UNINCODE
        hr = m_cpCmdGrammar->LoadCmdFromFile(wszXMLFile, SPLO_DYNAMIC);


        //MessageBox(NULL, (LPCWSTR)L"语音识别已启动!", (LPCWSTR)L"提示", MB_CANCELTRYCONTINUE );
        //激活语法进行识别
        //hr = m_cpDictationGrammar->SetDictationState(SPRS_ACTIVE);//dictation
        hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE);//C&C
        hr = m_cpRecoEngine->SetRecoState(SPRST_ACTIVE);

    }

    else
    {
        MessageBox(NULL, (LPCWSTR)L"语音识别引擎启动出错!", (LPCWSTR)L"警告", MB_OK);
        exit(0);
    }


    //释放com资源
    ::CoUninitialize();
    //hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_INACTIVE);//C&C


}

(5)定义消息处理函数
需要和其他的消息处理代码放在一起,如本文代码中,放在文末示例代码的DlgProc()函数尾部。本文整个其他的代码块都可以直接照搬,只需要更改如下的消息反应模块即可

//消息处理函数
USES_CONVERSION;
    CSpEvent event;

    if (m_cpRecoCtxt)
    {
        while (event.GetFrom(m_cpRecoCtxt) == S_OK){

            switch (event.eEventId)
            {
            case SPEI_RECOGNITION:
            {
                                     //识别出了语音
                                     m_bGotReco = TRUE; 

                                     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);
                                     CString Recstring;
                                     Recstring.Empty();
                                     Recstring = SRout;

                                    //做出反应(*****消息反应模块*****)
                                    if (Recstring == "发短信")
                                     {
                                         //MessageBox(NULL, (LPCWSTR)L"好的", (LPCWSTR)L"提示", MB_OK);
                                         MSSSpeak(LPCTSTR(_T("好,马上发短信!")));

                                     }

                                     else if (Recstring == "李雷")
                                     {
                                         MSSSpeak(LPCTSTR(_T("好久没看见他了,真是 long time no see")));
                                     }   

            }
                break;
            }
        }
    }

(6)修改语法文件
修改CmdCtrl.xml文件,可以提高某些词汇的识别度,对里面的词识别效果会很好多,如人名等。(此外,单独运行exe时也需要将此文件和exe放在同一文件夹内,不放也不会报错,只是语法文件里的词汇识别效果变差)

<?xml version="1.0" encoding="utf-8"?>
<GRAMMAR LANGID="804">
  <DEFINE>
    <ID NAME="VID_SubName1" VAL="4001"/>
    <ID NAME="VID_SubName2" VAL="4002"/>
    <ID NAME="VID_SubName3" VAL="4003"/>
    <ID NAME="VID_SubName4" VAL="4004"/>
    <ID NAME="VID_SubName5" VAL="4005"/>
    <ID NAME="VID_SubName6" VAL="4006"/>
    <ID NAME="VID_SubName7" VAL="4007"/>
    <ID NAME="VID_SubName8" VAL="4008"/>
    <ID NAME="VID_SubName9" VAL="4009"/>
    <ID NAME="VID_SubNameRule" VAL="3001"/>
    <ID NAME="VID_TopLevelRule" VAL="3000"/>
  </DEFINE>
  <RULE ID="VID_TopLevelRule" TOPLEVEL="ACTIVE">
    <O>
      <L>
        <P>我要</P>
        <P>运行</P>
        <P>执行</P>
      </L>
    </O>
    <RULEREF REFID="VID_SubNameRule" />
  </RULE>
  <RULE ID="VID_SubNameRule" >
    <L PROPID="VID_SubNameRule">
      <P VAL="VID_SubName1">发短信</P>
      <P VAL="VID_SubName2">是的</P>
      <P VAL="VID_SubName3">好的</P>
      <P VAL="VID_SubName4">不用</P>
      <P VAL="VID_SubName5">李雷</P>
      <P VAL="VID_SubName6">韩梅梅</P>
      <P VAL="VID_SubName7">中文界面</P>
      <P VAL="VID_SubName8">英文界面</P>
      <P VAL="VID_SubName9">English</P>

    </L>
  </RULE>
</GRAMMAR>

源代码下载

注意,本代码是在原来的项目中截取出来的,但可以独立运行。
Microsoft Speech SDK 安装包下载:
http://download.csdn.net/detail/michaelliang12/9510691
文中示例程序下载(之前下载分数太高,我已经重新上传了新版本,也解决了kincect20.lib报错的问题。由于自己经常在csdn上下东西,也需要积分,需要还是需要各位捧场,2积分。。):
http://download.csdn.net/detail/michaelliang12/9766783

存在的bug:每次运行完程序,Windows的语音识别助手不会自动关闭,需要自己手动关闭。若不关闭,则下次启动程序可能会出错。大家如果有好的解决办法,请联系我,谢了!

参考网站

1,http://www.cnblogs.com/eping/archive/2010/05/23/1742201.html
2,http://blog.csdn.net/pamchen/article/details/7856207
3,http://blog.csdn.net/jmxiaocai/article/details/7036033
4,http://blog.csdn.net/buaalei/article/details/5372544(主要参考)
5,http://blog.csdn.net/itcastcpp/article/details/5313204
6,http://blog.csdn.net/artemisrj/article/details/8723095(MFC的消息处理响应版本)

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