2017-10-15 23:20:45 mystery_guest 阅读数 353
  • C++语音识别开篇

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

    6094 人正在学习 去看看 杨波
第一步:采样
人的声音频率是有范围的,所以采样也应当选取范围。采样率是最低频率的2倍,此乃常识。至于最低频率怎样定,可以根据实际情况。
1、注意你的麦克风,有些麦克风是有接受范围的,把频率定得比麦克风的能力极限还低,显然是浪费。
2、用途。如果是要求可靠性很高的系统,则要注意加大频率范围。如果要求实时性比较高,那就要考虑处理机的速度了,数据量和频宽是正比的。
3、性别。男人的低音部分比女人更重要。所以如果对性别加以区分,那么在识别不同性别时应该采用不同下限。
4、特别指出,小心干扰。频率范围大了,噪音也就多。如果扩大的范围内噪音比较多,那还是不要的好。
第二步:语音处理
采样进入计算机后,成为一段段的数据,表明各个时刻的声音能量。处理时,第一步就是消除噪音,消不了这个东西,下面怎么都不好搞。可消除的主要是电器噪音,方法是完全静音时,录下电路信号,反相回到声音上去就成了。再下面就是断字了。人类语言是分音节的,音节之间是有一个停顿的,特别是汉语就更明显了。我主要讲的是汉语,在输入的数据中舍去能量低于一定值的部分,余下次的一段段的就对应各个字了。这需要解决两个问题,第一,舍去的标准,显然人说话声音有高有低,不能硬来。我的建议是取波形,不管说话声音高低,声音总是有形状的,不妨先取几个完整的波形,算出平均能量,取它的几分之一作为标准即可。而且这个过程似乎应该是动态的。第二是舍去一部分后,余下的部分可能不太整齐,由于噪音等原因,该舍的可能没舍,这就会有问题。解决这个问题大概可以在舍去时,不仅根据值的大小,还要根据两边的情况。这关系到舍去函数了,不是很难。断开各个字之后,就可以进行匹配了。原来的样本经过处理后,变成时间的函数,以时间为顺序取得一组值,成为N维向量。待处理的数据也同样进行,采用波形插值法从采样中取出N维向量,与样本进行匹配。 这关键是一个匹配函数的问题,即由两个向量在空间的相互位置得到一个匹配度,与样本依次比较,得出各自的匹配度。
由于各个样本都要匹配,所以速度很重要。通常的改进方法是进行多次匹配,即只把某些坐标进行对比,值大于某个标准才进行二次匹配。 这个标准可以是动态的,比如已进行过的对比的第M大的值。 为什么不到最大值,主要是需要保留多个结果。同时M可调,也便于在处理特殊情况时进行智能应变。匹配时,相应的计算函数相当重要,样本要相当的标准,同时以此样本为中心,扩张出多层区域,每层内的向量得到各层的匹配度,由此只要划定相应的匹配区域,给出值就可以了。
这里要多说一点,一般来说,匹配时都采用统一的函数,我却不这么认为,特别是汉语,语音的种类很少,不如将它们分组,每个组函数都不一样。也就是在匹配时,跟据要操作的目标,可以得到相应的匹配函数,进行匹配。 我觉得这要比用同一个匹配函数有效的多。而且,在调节对具体某个字的识别时,也很容易,同时在让它自动学习的时候,也很容易搞。你可以自己设计一个软件,把样本显示在二维坐标上(X:时间,Y:能量),输入一个声音时,把相应的量也显示在坐标系上。这是两条曲线。一方面,你可以反复地读样本,让软件把各条曲线求出来,然后取个中间值更新样本。另一方面,你也可以人脑辅助,根据自己反复读样本得出的曲线,对坐标空间进行分割,得出相应的匹配函数。也就是说,样本可以通过学习自动升级,匹配函数也可以由人脑加入进行升级。我认为这样会更高效一点。分组还有一个好处就是把相近的音归到一组,如果输入的数据和其中一个相差太远,其他的就可以跳过去了。这样可以提高速度。匹配这后,就把结果送入下一模块,其结果应该是这样:X:概率Xo,Y:概率Yo……如此等等,要送入概率最大的M个字,同时附上各字的概率。
第三步:上下文对照选定文字
这似乎和词库有关,所以词库的组织要好,词汇量要大,重要的一点是自己能够学习。出现新词要能记住,常用词要靠前,等等。这是微软的做法。微软采取的另一个方法是输入的词语先不交给应用程序,而是自己有一个缓冲区,输入的词语放在缓冲内,显示在屏幕上,这样一方面可以在输入下文后,依次修改上文,(交给应用程序后可就改不了。)另一方面也可以让用户通过手工操作对文字选择进行干预,从而提高效率。
2018-05-25 14:15:18 u012853614 阅读数 4114
  • C++语音识别开篇

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

    6094 人正在学习 去看看 杨波

       想要灵活调用讯飞语音识别模块,要理解每个函数的功能,以及调用步骤和方式。看了两天的讯飞语音识别模块,基本理解了讯飞语音识别的工作原理。所以结合讯飞官方资料和自己的理解做一个记录,方便以后使用。

sr_init()

        讯飞语音识别给的实例demo_mic函数中,调用的第一个的函数是sr_init(),函数原型:

int sr_init(struct speech_rec * sr, const char * session_begin_params, enum sr_audsrc aud_src, int devid, struct speech_rec_notifier * notify)
{
	int errcode;
	size_t param_size;
	WAVEFORMATEX wavfmt = DEFAULT_FORMAT;

	if (aud_src == SR_MIC && get_input_dev_num() == 0) {  //get_input_dev_num 获取录音设备的总数。 
		return -E_SR_NOACTIVEDEVICE;
	}

	if (!sr)
		return -E_SR_INVAL;

	if (session_begin_params == NULL) {
		session_begin_params = DEFAULT_SESSION_PARA;
	}

	SR_MEMSET(sr, 0, sizeof(struct speech_rec));
	sr->state = SR_STATE_INIT;
	sr->aud_src = aud_src; 
	sr->ep_stat = MSP_EP_LOOKING_FOR_SPEECH;  //初始化 0 尚未开始说话
	sr->rec_stat = MSP_REC_STATUS_SUCCESS;   //识别状态  初始化部分结果成功识别
	sr->audio_status = MSP_AUDIO_SAMPLE_FIRST; //指示如何处理样本缓冲区 样本缓冲区的开始

	param_size = strlen(session_begin_params) + 1;
	sr->session_begin_params = (char*)SR_MALLOC(param_size);
	if (sr->session_begin_params == NULL) {
		sr_dbg("mem alloc failed\n");
		return -E_SR_NOMEM;
	}
	strncpy(sr->session_begin_params, session_begin_params, param_size - 1);

	sr->notif = *notify;
	
	if (aud_src == SR_MIC) {
		errcode = create_recorder(&sr->recorder, iat_cb, (void*)sr); // 创建一个录音机对象。第二个参数为回调函数(参数包括: 音频数据地址,数据长度, 在create_recorder时传入的user_cb_para用户参数。)。 创建成功后的对象在不需再使用后,使用destroy_recorder销毁.  
		if (sr->recorder == NULL || errcode != 0) {
			sr_dbg("create recorder failed: %d\n", errcode);
			errcode = -E_SR_RECORDFAIL;
			goto fail;
		}
		update_format_from_sessionparam(session_begin_params, &wavfmt);
	
		errcode = open_recorder(sr->recorder, devid, &wavfmt);  //参数 录音机对象  录音设备,windows下用整形标示,从0开始。可以使用get_default_input_dev获取默认的录音设备 录音格式
		if (errcode != 0) {
			sr_dbg("recorder open failed: %d\n", errcode);
			errcode = -E_SR_RECORDFAIL;
			goto fail;
		}
	}

	return 0;

fail:
	if (sr->recorder) {
		destroy_recorder(sr->recorder);
		sr->recorder = NULL;
	}

	if (sr->session_begin_params) {
		SR_MFREE(sr->session_begin_params);
		sr->session_begin_params = NULL;
	}
	SR_MEMSET(&sr->notif, 0, sizeof(sr->notif));

	return errcode;
}

参数一:讯飞定义的结构体,包含的录的

struct speech_rec {
	enum sr_audsrc aud_src;  //sr_audsr枚举变量,只包含两个参数SR_MIC,SR_USER, 第一个代表从麦克风数据,第二个代表从文件(这里不做记录)
	struct speech_rec_notifier notif;  /*包含三个回调函数, 初始化的三个函数分别表示:结果,开始,结束*/
	const char * session_id;  //这个参数保存的是开始一次会话是  QISRSessionBegin返回的会话ID
	int ep_stat;   //当前的指针状态,初始化是会使用一个枚举变量赋值
	int rec_stat;  //识别状态,初始化时会使用一个枚举变量赋值
	int audio_status;  //指示如何处理样本缓冲区,初始化时会使用一个枚举变量赋值
	struct recorder *recorder; //winrec.h中定义的录音机对象结构体
	volatile int state;  //状态,枚举变量只有两个值 SR_STATE_INIT  SR_STATE_STATED
	char * session_begin_params; //会话的各种参数
};

参数二:会话的各种参数,初始化是会保存到struct speech_rec定义的对象中

示例:

const char* session_begin_params = "sub = iat, domain = iat, language = zh_cn, accent = mandarin, sample_rate = 16000, result_type = plain, result_encoding = gb2312";

详细说明:点击打开链接

参数三:指示是从麦克风输入还是从用户文件输入

参数四:录音设备ID,如果为-1,则会从默认设备输入

参数五:包含三个回调函数的结构体

        调用sr_init会初始化参数sr的各种信息,并使用create_recorder打开一个录音机对象,函数执行成功后会把struct speech_rec中的recorder指向打开的录音对象,然后调用open_recorder配置录音设备和录音格式,并打开录音机

create_recorder,open_recorder说明:点击打开链接

sr_start_listening(控制流程这里不做记录)

           调用sr_init初始化信息以后,调用sr_start_listening开始进行识别,函数原型:

int sr_start_listening(struct speech_rec *sr, const char* gram)  //开始录音
{
	int ret;
	const char*		session_id = NULL;
	int				errcode = MSP_SUCCESS;

	if (sr->state >= SR_STATE_STARTED) {
		sr_dbg("already STARTED.\n");
		return -E_SR_ALREADY;
	}

	session_id = QISRSessionBegin(gram, sr->session_begin_params, &errcode); //开始一次语音识别  如果听写不需要语法,第一个参数为NULL, 如果是命令词识别,此处传入MSPUploadData的返回值
	if (MSP_SUCCESS != errcode)
	{
		sr_dbg("\nQISRSessionBegin failed! error code:%d\n", errcode);
		return errcode;
	}
	sr->session_id = session_id;
	sr->ep_stat = MSP_EP_LOOKING_FOR_SPEECH;  //有语音输入,但是没有结束
	sr->rec_stat = MSP_REC_STATUS_SUCCESS;  //成功识别一部分
	sr->audio_status = MSP_AUDIO_SAMPLE_FIRST;  //采样缓冲区的开始

	if (sr->aud_src == SR_MIC) {
		ret = start_record(sr->recorder);  //调用winrecstart_record   开始录音
		if (ret != 0) {
			sr_dbg("start record failed: %d\n", ret);
			QISRSessionEnd(session_id, "start record fail");
			sr->session_id = NULL;
			return -E_SR_RECORDFAIL;
		}
#ifdef __FILE_SAVE_VERIFY__
		open_stored_file(VERIFY_FILE_NAME);
#endif
	}

	sr->state = SR_STATE_STARTED;

	if (sr->notif.on_speech_begin)
		sr->notif.on_speech_begin();

	return 0;
}

这里面会调用QISRSessionBegin进行一次语音识别,函数调用成功返回字符串格式的sessionID,失败返回NULL。sessionID是本次识别的句柄。参数只在当次识别中生效。然后调用start_record开始录音

iat_cbsr_write_audio_data

start_record执行后,会调用在sr_init->create_recorder配置好的回调函数iat_cb,iat_cb会调用sr_write_audio_datasr_write_audio_data再调用QISRAudioWrite写入本次音频数据,然后在使用QISRGetResult获取识别结果,在使用on_result输出字符串。识别一次结束后会调用end_sr_on_vad结束一次会话

static void iat_cb(char *data, unsigned long len, void *user_para)   //创建录音机对象是传入的回调函数
{
	int errcode;
	struct speech_rec *sr;
	if (len == 0 || data == NULL)
		return;
	sr = (struct speech_rec *)user_para;
	if (sr == NULL || sr->ep_stat >= MSP_EP_AFTER_SPEECH)
		return;
#ifdef __FILE_SAVE_VERIFY__
	loopwrite_to_file(data, len);
#endif
	errcode = sr_write_audio_data(sr, data, len);  //写入录音数据
	if (errcode) {
		end_sr_on_error(sr, errcode);
		return;
	}
}
int sr_write_audio_data(struct speech_rec *sr, char *data, unsigned int len)
{
	const char *rslt = NULL;
	int ret = 0;
	if (!sr)
		return -E_SR_INVAL;
	if (!data || !len)
		return 0;
	ret = QISRAudioWrite(sr->session_id, data, len, sr->audio_status, &sr->ep_stat, &sr->rec_stat);
	if (ret) {
		end_sr_on_error(sr, ret);
		return ret;
	}
	sr->audio_status = MSP_AUDIO_SAMPLE_CONTINUE;
	if (MSP_REC_STATUS_SUCCESS == sr->rec_stat) { //已经有部分听写结果
		rslt = QISRGetResult(sr->session_id, &sr->rec_stat, 0, &ret);
		if (MSP_SUCCESS != ret)	{
			sr_dbg("\nQISRGetResult failed! error code: %d\n", ret);
			end_sr_on_error(sr, ret);
			return ret;
		}
		if (NULL != rslt && sr->notif.on_result)
			sr->notif.on_result(rslt, sr->rec_stat == MSP_REC_STATUS_COMPLETE ? 1 : 0);
	}
	if (MSP_EP_AFTER_SPEECH == sr->ep_stat)
		end_sr_on_vad(sr);
	return 0;
}

流程总结:

使用sr_init初始化相关信息---->创建(关联回调函数)并打开录音设备

sr_start_listening---->QISRSessionBegin开始一次识别---->start_record进入回调函数----->iat_cb---->sr_write_audio_data写入录音数据----->QISRAudioWrite写入本次识别的数据---->QISRGetResult识别完成获取识别结果---->on_result获取识别结果----->end_sr_on_vad一次识别完成

资料:

点击打开链接

MSC For WindowsAPI





2020-03-30 12:05:48 qq_43590728 阅读数 11
  • C++语音识别开篇

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

    6094 人正在学习 去看看 杨波

一:Note

今天分享一下最近用到的JQ6500语音模块,我主要是用它来做个语音播报功能,同时在使用中遇到的一些问题。

二:使用说明

这个模块一些什么使用场景的废话我就不讲了,主要讲一些比较重要的部分。
1、它的工作电压,这个点我觉得我还挺重要,因为在后面我使用的时候,发现有的时候语音出来是很短,一下就没了,后来发现是电压这里的问题
在这里插入图片描述
2、 实物图及原理图,新手刚拿到,就只能按照这个图来连线,对好个个引脚。在这里插入图片描述
在这里插入图片描述
3、通讯命令,它是支持异步串口通信,波特率9600,8位数据位,没有校验位,没有流控制,这里也要注意,在利用串口调试的时候,这些参数都要设置好,一旦有偏差都通信不了。调试的时候利用串口调试助手就可以,尤其注意一点,发送数据的时候,要勾选上以十六进制发送数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
组合播放 :
连续发送【7E 04 03 00 01 EF】【7E 04 03 00 02 EF】【7E 04 03 00 03 EF】,则连续播放第一首、第二首、第三首,最多可以十首组合,播放完停止。

三:添加语音

拿到这个模块,当然需要是自己弄语音进去让他播放,这里就要使用到更新语音这个环节了。拿一根usb线,连接上模块的miniUSB口,注意,这里的USB线,我之前用的是那种充电宝的万能充电线,然后就一直不行,后来我换了一个单一的usb线就可以了,所以如果你的也是这样连接不上,可以试一下换一根USB线。然后你插上电脑,就可以了,就会出现以下情况
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样就可以了,先要下的进去语音,才能用串口调试一下各个指令。哦,对,还有一个合成语音软件,做语音播报一般都是合成自己需要的语音就可以,如果你需要,留言给我,我可以分享给你!

四:软件控制

我是用STM32实现的,用了一个串口,然后通过程序实现语音播放

void uart3_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//使能USART3,GPIOB时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  
	//USART3_TX   GPIOB.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);
   
  //USART3_RX	  GPIOB.11初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

  USART_Init(USART3, &USART_InitStructure); 
//  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART3, ENABLE);                     

}

//音乐播放  7e 04 03 00 02 ef
void Play(u16 cmd)
{
		USART_SendData(USART3,0x7E);
		delay_ms(1);
		USART_SendData(USART3,0x04);
		delay_ms(1);
		USART_SendData(USART3,0x03);
		delay_ms(1);
		USART_SendData(USART3,0x00);
		delay_ms(1);
		USART_SendData(USART3,cmd);
		delay_ms(1);
		USART_SendData(USART3,0xEF);
		delay_ms(1);

}

五:总结

1、语音模块一般都要搭一个喇叭才能外放声音,我是接了一个0.5欧8w的喇叭,接在原理图spk那里。
2、更新语音插入无显示,尝试换一根usb线。
3、串口调发送数据以十六进制
4、出现语音断续,可能是电压的问题。

2018-07-25 11:43:43 sparkexpert 阅读数 1267
  • C++语音识别开篇

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

    6094 人正在学习 去看看 杨波

CTC模型是语音识别模型中常见的模块之一,现有主流的语音识别系统经常采用该模型来实现端到端的语音识别。而CTC出现之前,语音识别模型的端到端识别效果还是相对较弱的,也就是说CTC解决了这一问题。

1、CTC的相关原理

深度学习的序列到序列模型可以解决许多现实任务,如:

由于seq2seq模型往往需要输入序列和输出标注之间具备一一对应关系,然而语音识别是该模型中比较特殊的一块,由于在语音识别中,一个声音信号被转换成words或者是sub-word单元,在利用seq2seq模型时,它要求预先分割(pre-segmented)的训练数据,通过后处理将模型输出转换为label序列,然而由于识别出的字符序列或者音素序列长度远小于输入的特征帧序列,无法达到一一对应关系,因此它的应用受到较大的限制。

因此在语音识别模型中,引入了CTC模型(Connectionist temporal classification),它往往接在RNN网络的最后一层用于序列学习所用;对于一段输入序列长度为T的序列来说,每个样本点 t 在RNN网络的最后一层都会输出一个softmax向量,表示预测概率,接上CTC模型之后,就可以正确预测出序列的标签;

其示意图如下所示:

2、CTC的安装

(1)进行创建和make

git clone https://github.com/SeanNaren/warp-ctc.git
cd warp-ctc
mkdir build; cd build
cmake ..
make

从而可见该安装成功。

(2)进行pytorch绑定CTC的安装

export CUDA_HOME="/usr/local/cuda"
cd ../pytorch_binding
python setup.py install

注:在这过程中需要先安装cffi.

pip install cffi

 

(3)安装成功的具体界面如下:

 

(4)在python中的调用结果如下,可见其已经安装成功。

2018-01-10 21:01:00 weixin_34292402 阅读数 33
  • C++语音识别开篇

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

    6094 人正在学习 去看看 杨波

Python 语音

实现语音操控的原理

语音操控分为语音识别和语音朗读两部分

我们使用speech模块实现语音模块(python 2.7)

SAPI是微软Speech API , 是微软公司推出的语音接口,而细心的人会发现从WINXP开始,系统上就已经有语音识别的功能了,可是用武之地相当之少,他并没有给出一些人性化的自定义方案,仅有的语音操控命令显得相当鸡胁。  
 
  • Python pywin32,可以使Python调用WIN32COM接口,选择对应版本下载(区分32位/64位),直接双击运行即可

1309340-20180110201043426-375387733.png

  • 安装speech模块:pip install speech

实现个简易的控制电脑做事情的小程序:

  • 首先,来个测试文件

此处仅为启动和关闭语音系统

import speech
while True:
    phrase =speech.input()
    speech.say("You said %s"%phrase)
    if phrase =="turn off":
        break

1309340-20180110200819488-910561305.png

  • 自制个中文库
phrase = {"closeMainSystem" : "关闭人机交互"
        , "film" : "我要看电影"
        , "listenMusic" : "我好累啊"
        , "blog" : "看博客"
        , "cmd" : "cmd" }
  • 设计语音对应的电脑操作

def callback(phr, phrase):
    if phr == phrase["closeMainSystem"]:
        speech.say("Goodbye. 人机交互即将关闭,谢谢使用")
        speech.stoplistening() 
        sys.exit()
    elif phr == phrase["film"]:
        speech.say("正在为您打开优酷")
        webbrowser.open_new("http://www.youku.com/")
    elif phr == phrase["listenMusic"]:
        speech.say("即将为你启动豆瓣电台")
        webbrowser.open_new("http://douban.fm/")
    elif phr == phrase["blog"]:
        speech.say("即将进入Dreamforce.me")
        webbrowser.open_new("http://www.cnblogs.com/darksouls/")
    elif phr == phrase["cmd"]:
        speech.say("即将打开CMD")
        os.popen("C:\Windows\System32\cmd.exe")

    # 可以继续用 elif 写对应的自制中文库中的对应操作
  • 主程序
while True:
    phr = speech.input()
    speech.say("You said %s" % phr)
    callback(phr, phrase)

  • 完整代码
# _*_ coding:utf-8 _*_

import os
import sys
import speech
import webbrowser

phrase = {"closeMainSystem" : "关闭人机交互"
        , "film" : "我要看电影"
        , "listenMusic" : "我好累啊"
        , "blog" : "看博客"
        , "cmd" : "cmd" }


def callback(phr, phrase):
    if phr == phrase["closeMainSystem"]:
        speech.say("Goodbye. 人机交互即将关闭,谢谢使用")
        speech.stoplistening() 
        sys.exit()
    elif phr == phrase["film"]:
        speech.say("正在为您打开优酷")
        webbrowser.open_new("http://www.youku.com/")
    elif phr == phrase["listenMusic"]:
        speech.say("即将为你启动豆瓣电台")
        webbrowser.open_new("http://douban.fm/")
    elif phr == phrase["blog"]:
        speech.say("即将进入Dreamforce.me")
        webbrowser.open_new("http://www.cnblogs.com/darksouls/")
    elif phr == phrase["cmd"]:
        speech.say("即将打开CMD")
        os.popen("C:\Windows\System32\cmd.exe")

    # 可以继续用 elif 写对应的自制中文库中的对应操作

while True:
    phr = speech.input()
    speech.say("You said %s" % phr)
    callback(phr, phrase)

发现网上有个语音识别框架:

# _*_ coding:utf-8 _*_

from win32com.client import constants
import os
import win32com.client
import pythoncom

speaker = win32com.client.Dispatch("SAPI.SPVOICE")


class SpeechRecognition:
    def __init__(self, wordsToAdd):
        self.speaker = win32com.client.Dispatch("SAPI.SpVoice")
        self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
        self.context = self.listener.CreateRecoContext()
        self.grammar = self.context.CreateGrammar()
        self.grammar.DictationSetState(0)
        self.wordsRule = self.grammar.Rules.Add("wordsRule", constants.SRATopLevel + constants.SRADynamic, 0)
        self.wordsRule.Clear()[self.wordsRule.InitialState.AddWordTransition(None, word) for word in wordsToAdd]
        self.grammar.Rules.Commit()
        self.grammar.CmdSetRuleState("wordsRule", 1)
        self.grammar.Rules.Commit()
        self.eventHandler = ContextEvents(self.context)
        self.say("Started successfully")
    def say(self, phrase):
        self.speaker.Speak(phrase)
class ContextEvents(win32com.client.getevents("SAPI.SpSharedRecoContext")):
    def OnRecognition(self, StreamNumber, StreamPosition, RecognitionType, Result):
        newResult = win32com.client.Dispatch(Result)
        print("你在说 ", newResult.PhraseInfo.GetText())
        speechstr=newResult.PhraseInfo.GetText()
        # 下面即为语音识别信息对应
        if  speechstr=="张三":
            speaker.Speak("lisi")
        elif  speechstr=="你好":
            speaker.Speak("hello world")
        elif  speechstr=="国庆快乐":
            speaker.Speak("Happy   nationalday")
        elif  speechstr=="新年快乐":
            speaker.Speak("happy  New Year")
        elif  speechstr=="李四":
            speaker.Speak("a  beauty baby")
        elif  speechstr=="王五":
            speaker.Speak("a  little boy")
        elif  speechstr=="赵六":
            speaker.Speak("a  boy  can  coding")
        else:
            pass

if __name__ == '__main__':

    speaker.Speak("语音识别开启")
    wordsToAdd = ["张三",
                  "你好",
                  "国庆快乐",
                  "新年快乐",
                  "李四",
                  "王五",
                  "赵六",]
    speechReco = SpeechRecognition(wordsToAdd)
    while True:
        pythoncom.PumpWaitingMessages()

转载于:https://www.cnblogs.com/darksouls/p/8260762.html

https://www.zhihu.com/question/20398418

博文 来自: AMDS123

语音识别原理

阅读数 353

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