2019-08-03 14:55:08 qq_34623621 阅读数 89
  • C++语音识别开篇

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

    5915 人正在学习 去看看 杨波

LDV7 语音识别模块使用

在这里插入图片描述1、初次使用测试步骤

(1)连接 USB 下载器,接上 GND、RXD、TXD、 5V,注意 RXD/TXD 必须交叉连接,才能进行一
收一发通信,在 PC 机上打开串口调试工具,设定波特率为
9600bit/s。
(2)将 USB 下载器连接到 PC 机,查看该下载器在 PC 机 中占用的串口通道,然后对应选择调试工具的串口号,设定 后,重新给模块通上电源(拔下 GND 连接线,再重新连接,
即可以重新上电,下载程序时冷启动也是一样的操作),这时, 调试工具接收窗口将打印出相关口令。
(3)本模块出厂默认下载的是口令模式程序,用户根据串口所示 的口令内容,先对着咪头发一级口令(“小杰”),待板上的 D1 灯点 亮后,可以开始对其他二级口令的识别,如此循环操作识别。
识别操作。如识别成功,则有相关反馈信息。
(4)调试完毕
(5)测试好模块后可以与其他单片机设备进行通讯,连接方式和 测试方法与在 PC 机调试一样。

2、配套程序识别命令修改步骤
(1)添加关键词和识别码

打开程序,在 LDChip.C 文件中找到 uint8 LD_AsrAddFixed() 函 数,在该函数里面可以找到如下图所示内容:
在这里插入图片描述
----根据关键词的数量和长度修改宏定义 DATE_A 和 DATE_B , 例如您要添加 10 个关键词,在这些关键词中最长的一句长度为 30,
那么定义如下:
#define DATE_A 10
#defi----根据关键词的数量和长度修改宏定义 DATE_A 和 DATE_B , 例如您要添加 10 个关键词,在这些关键词中最长的一句长度为 30,
那么定义如下:
#define DATE_A 10
#define DATE_B 30
—sRecog[ ][ ] 数组为关键词数组,添加内容为拼音输入方式,
例如想添加“开灯”命令,则写入“kai deng”,每个汉字间的拼音用 空格隔开。
—pCode[ ] 数组为识别码数组,所添加的识别码为预先定义好的 宏定义常量值,同时必须和关键词一一对应,如上图所示,“da ma ce
ne DATE_B 30
—sRecog[ ][ ] 数组为关键词数组,添加内容为拼音输入方式,
例如想添加“开灯”命令,则写入“kai deng”,每个汉字间的拼音用 空格隔开。
—pCode[ ] 数组为识别码数组,所添加的识别码为预先定义好的 宏定义常量值,同时必须和关键词一一对应,如上图所示,“da ma ce shi”命令对应的识别码为 CODE_DMCS 。
(2)定义识别码

打开程序,在 LDChip.h 文件中找到如下图所示内容:
在这里插入图片描述
—此处即为识别码的添加和修改,用户可以根据自己的需要和喜 好任意定义识别码和宏名,但必须和前面所使用的识别码配对,否则 会提示未定义错误。
(3)修改处理函数

打开程序,在 main.c 文件中找到 void User_handle(uint8 dat)函数,
在该函数中可以看到如下图所示内容:
在这里插入图片描述

2018-10-28 15:12:56 weixin_42445727 阅读数 4888
  • C++语音识别开篇

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

    5915 人正在学习 去看看 杨波

买了2种语音模块,一个龙邱SYN7318,一个讯飞的离线语音模块,今天先记录下移植SYN7318,讯飞的还没搞

这个是已经移植到正点原子F1开发板的程序,下载地址:https://download.csdn.net/download/weixin_42445727/10749169

 一、买到模块之后找客服要资料,说真的,每次用个新的模块,都是一堆资料,其实我感觉很多都没必要看,今天记录下这个,就是可以让第一次用的人可以节省时间,快速上手这个模块

二、模块的词条烧录

通过USB转TTL与模块相连,只需要连接模块的TX、RX、VCC、GND即可烧录

1、打开这个软件,

2、修改资源中文本文件,将其改成自己要识别的词条,这里我将【03词典-用户1】改成这样,跟我上传的程序对应

3、可以用这个软件简单的测试一下识别效果。点击【开始识别】按钮,说出文本文件中的词条,在软件中可以看到识别结果

 

4、点击【词条更新】按钮,即可将自己设置的词条烧录到模块中。

三、将模块连接到单片机进行实验

1、模块与单片机的硬件连接

 其实上面很多引脚留出来都没什么作用,当然也可能我自己没用到。

2、将我上传的程序,烧录到原子的开发板中,说出相应的词条就可以看到LED有相应的效果。

关于程序识别语音和实现语音播报,在程序中有详细的注释。

2019-02-15 17:33:15 lindonghai 阅读数 736
  • C++语音识别开篇

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

    5915 人正在学习 去看看 杨波


方案一:
承芯卓越 HBR620/HBR640/HBR740

方案二:
TELESKY LD3320

方案三:
科大讯飞

2018-05-25 14:15:18 u012853614 阅读数 3477
  • C++语音识别开篇

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

    5915 人正在学习 去看看 杨波

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

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





2018-09-24 21:09:04 weixin_40943549 阅读数 7216
  • C++语音识别开篇

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

    5915 人正在学习 去看看 杨波

本文,为python3安装语音识别模块,这是一个语音识别模块,可以把音频转化为文字。

需要工具

  • 电脑 win8系统

  • python3(Anaconda)

方法/步骤

1.如果需要使用麦克风输入音频,需要先安装pyaudio模块。

2.pyspeech模块的安装

3.如果需要调用谷歌的云语音API接口,需要安装谷歌-api-python-client模块

4.最后,安装语音识别模块。 

直接和上面一样  pip  install  specchrecognition

 

Sphinx语音识别

阅读数 1238

语音识别入门

阅读数 6950

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