-
我根据ASR-beginer大佬发表的博客unimrcp对接华为云ASR(Linux版)(https://bbs.huaweicloud.com/blogs/423604)成功实现了unimrcp插件化华为云的asr引擎。环境: centos7.9 +freeswtich 1.10.13 +unimrcp 1.8.0问题描述:使用fs拨号 1001测试并调用lua脚本,脚本逻辑 播放欢迎语 并可随时打断,目前没有进行打断操作。脚本命令:result = session:execute("play_and_detect_speech", "say:'" .. text .. "' detect:unimrcp:uni2 {barge_in=true,no-input-timeout=5000}builtin:speech/transcribe") I0722 08:46:05.645720 9722 RasrListener.h:38] rasr receive event{"resp_type":"EVENT","trace_id":"a3f26933-33fc-4333-b345-c550b5aeeb15","event":"VOICE_START","timestamp":1753145165}I0722 08:46:10.086721 9722 RasrListener.h:38] rasr receive event{"resp_type":"EVENT","trace_id":"a3f26933-33fc-4333-b345-c550b5aeeb15","event":"VOICE_END","timestamp":1753145170}I0722 08:46:10.086751 9722 RasrListener.h:22] rasr receive {"resp_type":"RESULT","trace_id":"a3f26933-33fc-4333-b345-c550b5aeeb15","segments":[{"start_time":0,"end_time":10500,"is_final":true,"result":{"text":"喂喂喂喂喂喂喂","score":0.6077518463134766}}]}2025-07-22 08:46:13:470782 [INFO] Synthesis completed2025-07-22 08:46:13:470820 [INFO] Process SPEAK-COMPLETE Event <4030c67197fa4d00@speechsynth> [1]2025-07-22 08:46:13:470839 [NOTICE] State Transition SPEAKING -> IDLE <4030c67197fa4d00@speechsynth>2025-07-22 08:46:13:470879 [INFO] Send MRCPv2 Data 172.29.121.237:1544 <-> 172.29.121.237:58672 [122 bytes]MRCP/2.0 122 SPEAK-COMPLETE 1 COMPLETEChannel-Identifier: 4030c67197fa4d00@speechsynthCompletion-Cause: 000 normal关键日志说明:播放过程中在05秒识别到说话,10秒识别完成,13秒播放tts语音结束。期望表现:在05秒识别开始时发送打断信号。目前问题的核心代码:case Status::voice_start: apt_log(RECOG_LOG_MARK, APT_PRIO_INFO, "Detected Voice Activity " APT_SIDRES_FMT, MRCP_MESSAGE_SIDRES(recog_channel->recog_request)); huawei_recog_start_of_input(recog_channel); recog_channel->call_back->SetStatus(Status::recognizing); break;没有发送打断信息。后面我尝试更改代码发送打断信号:case Status::voice_start: { apt_log(RECOG_LOG_MARK, APT_PRIO_INFO, "Voice start detected, triggering barge-in"); // 保持voice_start状态直到语音结束 huawei_recog_start_of_input(recog_channel); recog_channel->call_back->SetStatus(Status::recognizing); // 发送立即打断指令 mrcp_message_t* bargein_msg = mrcp_event_create( recog_channel->recog_request, RECOGNIZER_START_INPUT_TIMERS, // 关键指令 recog_channel->recog_request->pool ); mrcp_engine_channel_message_send(recog_channel->channel, bargein_msg); break;}还是没有效果,我尝试更改指令:mrcp_message_t* bargein_msg = mrcp_event_create( recog_channel->recog_request, RECOGNIZER_BARGE_IN_OCCURRED, // 关键修改:使用标准事件 recog_channel->recog_request->pool);但是编译过程遇到:src/huawei_recog_engine.cc:764:21: error: 'RECOGNIZER_BARGE_IN_OCCURRED' was not declared in this scope RECOGNIZER_BARGE_IN_OCCURRED, // 关键修改:使用标准事件请求帮忙,如何让我顺利的进行打断操作?
-
华为 语音识别,支持方言吗?
-
如题,pytorch cpu训练很慢,使用的是开源的wenet语音识别框架,搭了一个nvidia/cuda:11.6.1-cudnn8-runtime-ubuntu20.04镜像,但用的是cpu,训练可以正常运行,性能表现是模型前向计算很慢,一个小时的训练数据,batchsize 16, num_worker 4, 模型参数量80M, 需要一个小时才能跑一个batch,16小时跑一个epoch,这是因为什么问题导致的呢,大佬们帮忙看看我仔细分析了下,发现是torch.nn.Conv1d这个函数跑的慢, X86跑了0.016秒,arm跑了0.254秒,这是测试代码: import torch import time # Create random input input_data = torch.randn(1, 256, 1000) # Create convolutional layer #conv1d_layer = torch.nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3) #start_time_x86 = time.time() conv1d_layer = torch.nn.Conv1d( 256, 256, 15, stride=1, padding=0, groups=256, bias=True, ) # Perform convolution on x86 start_time_x86 = time.time() output_x86 = conv1d_layer(input_data) end_time_x86 = time.time() time_elapsed_x86 = end_time_x86 - start_time_x86 print('Time elapsed on x86:', time_elapsed_x86) print(output_x86)
-
请问如何修改path,将麦克风实时监测的声音发送出去,实时识别并返回结果?# -*- coding: utf-8 -*- from huaweicloud_sis.client.rasr_client import RasrClient from huaweicloud_sis.bean.rasr_request import RasrRequest from huaweicloud_sis.bean.callback import RasrCallBack from huaweicloud_sis.bean.sis_config import SisConfig import json import os # 鉴权参数 # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SIS_AK/HUAWEICLOUD_SIS_SK ak = os.getenv("HUAWEICLOUD_SIS_AK") # 从环境变量获取ak 参考https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html assert ak is not None, "Please add ak in your develop environment" sk = os.getenv("HUAWEICLOUD_SIS_SK") # 从环境变量获取sk 参考https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html assert sk is not None, "Please add sk in your develop environment" project_id = "" # project id 同region一一对应,参考https://support.huaweicloud.com/api-sis/sis_03_0008.html region = 'cn-north-4' # region,如cn-north-4 """ todo 请正确填写音频格式和模型属性字符串 1. 音频格式一定要相匹配. 例如音频是pcm格式,并且采样率为8k,则格式填写pcm8k16bit。 如果返回audio_format is invalid 说明该文件格式不支持。具体支持哪些音频格式,需要参考一些api文档。 2. 音频采样率要与属性字符串的采样率要匹配。 例如格式选择pcm16k16bit,属性字符串却选择chinese_8k_common, 则会返回'audio_format' is not match model """ # 实时语音识别参数 path = '' # 需要发送音频路径,如D:/test.pcm, 同时sdk也支持byte流发送数据。 audio_format = 'pcm16k16bit' # 音频支持格式,如pcm16k16bit,详见api文档 property = 'chinese_16k_general' # 属性字符串,language_sampleRate_domain, 如chinese_16k_general, 采样率要和音频一致。详见api文档 class MyCallback(RasrCallBack): """ 回调类,用户需要在对应方法中实现自己的逻辑,其中on_response必须重写 """ def on_open(self): """ websocket连接成功会回调此函数 """ print('websocket connect success') def on_start(self, message): """ websocket 开始识别回调此函数 :param message: 传入信息 :return: - """ print('webscoket start to recognize, %s' % message) def on_response(self, message): """ websockert返回响应结果会回调此函数 :param message: json格式 :return: - """ print(json.dumps(message, indent=2, ensure_ascii=False)) def on_end(self, message): """ websocket 结束识别回调此函数 :param message: 传入信息 :return: - """ print('websocket is ended, %s' % message) def on_close(self): """ websocket关闭会回调此函数 """ print('websocket is closed') def on_error(self, error): """ websocket出错回调此函数 :param error: 错误信息 :return: - """ print('websocket meets error, the error is %s' % error) def on_event(self, event): """ 出现事件的回调 :param event: 事件名称 :return: - """ print('receive event %s' % event) def rasr_example(): """ 实时语音识别demo """ # step1 初始化RasrClient, 暂不支持使用代理 my_callback = MyCallback() config = SisConfig() # 设置连接超时,默认是10 config.set_connect_timeout(10) # 设置读取超时, 默认是10 config.set_read_timeout(10) # 设置connect lost超时,一般在普通并发下,不需要设置此值。默认是10 config.set_connect_lost_timeout(10) # websocket暂时不支持使用代理 rasr_client = RasrClient(ak=ak, sk=sk, use_aksk=True, region=region, project_id=project_id, callback=my_callback, config=config) try: # step2 构造请求 request = RasrRequest(audio_format, property) # 所有参数均可不设置,使用默认值 request.set_add_punc('yes') # 设置是否添加标点, yes or no, 默认no request.set_vad_head(10000) # 设置有效头部, [0, 60000], 默认10000 request.set_vad_tail(500) # 设置有效尾部,[0, 3000], 默认500 request.set_max_seconds(30) # 设置一句话最大长度,[1, 60], 默认30 request.set_interim_results('no') # 设置是否返回中间结果,yes or no,默认no request.set_digit_norm('no') # 设置是否将语音中数字转写为阿拉伯数字,yes or no,默认yes # request.set_vocabulary_id('') # 设置热词表id,若不存在则不填写,否则会报错 request.set_need_word_info('no') # 设置是否需要word_info,yes or no, 默认no # step3 选择连接模式 # rasr_client.short_stream_connect(request) # 流式一句话模式 # rasr_client.sentence_stream_connect(request) # 实时语音识别单句模式 rasr_client.continue_stream_connect(request) # 实时语音识别连续模式 # step4 发送音频 rasr_client.send_start() # 连续模式下,可多次发送音频,发送格式为byte数组 with open(path, 'rb') as f: data = f.read() rasr_client.send_audio(data) # 可选byte_len和sleep_time参数,建议使用默认值 rasr_client.send_end() except Exception as e: print('rasr error', e) finally: # step5 关闭客户端,使用完毕后一定要关闭,否则服务端20s内没收到数据会报错并主动断开。 rasr_client.close() if __name__ == '__main__': rasr_example()
-
语音交互服务包括了哪些功能
-
先明确智能硬件中声学(麦克风)使用的三个场景,避免简单的问题复杂化。第一个场景,通话使用。这是大部分智能硬件设计麦克风的主要原因,很多声学做起来感觉很简单的错觉也来源于此。第二个场景,较安静环境下人机交互。复用第一个场景的声学硬件,第二个场景马马虎虎也能用,虽然部分情况下效果不理想,但是,还没到完全不能用的状态。第三个场景,高噪环境下人机交互。主要是户外和人流量较多的环境下使用人机交互,第一个场景的声学硬件完全不能使用。对于第一个场景,通话使用,现在的主流芯片基本上已经内置了通话降噪算法,再加上绝大部分通话都是在安静场景下,因此,只要麦克风的性能指标不是太拉跨、电路设计没有硬伤,第一个场景中智能硬件的声学部分并不用做额外的测试。但是,很多开发者带着这样的惯性开发第二个和第三个场景的智能硬件时,就完全走不通了,售后问题比比皆是,基本都集中在声音处理上。那么,对于第二个和第三个场景,应该如何科学地自测声学部分呢?怎么判断声学部分是否符合量产条件呢?下面分享声学自测的规范。测试环境准备:环境安静,噪音<40dB,如无条件,选安静会议室设备周围无遮挡物测试工具准备:待测设备---预留50MB存储空间专业声压计--- 条件有限可使用手机app(例:手机应用市场-- Sound Meter HD)音频分析软件---Audition高保真音箱---条件有限可使用蓝牙音箱,无蓝牙音箱可使用电脑密封材料---淘宝购买 EVA海绵密封胶带10mm厚度测试音频准备:密封性测试音频(白噪声)1khz音频信号质量测试音频测试附件准备:单独提供测试记录表格《声学测试结果目标》测试音频附件测试方法一、自播自录制测试1-10项测试只录制一个音频:(1)设备调节到100%音量(2)设备先开始录制音频并保存,然后设备播放信号质量测试音频(3) 自播自录后,人正常说话,测试mic处人声音量为65db,保存原始音频和识别音频1、mic和回采幅度检查最低幅度检查1.用Audition软件打开音频,检查采样值。识别引擎要求采样值>2k,确保mic处65db人正常说话时峰值振幅采样值>2k。否则需要提高mic增益截幅检查检查每个声道振幅最大部分,确保每个声道无截幅鼠标中间放大波形,保证波形连续,且无削顶整改方式:减小增益或降低最大音量,让设备最大音量播放歌曲时,音频不截幅2、幅度一致性(单麦免测)(1)确保所有mic声道的幅度均值差值≤3db示例:1声道(-12db ),2声道(-9db),相差3db合格(2)回采的增益不能太小,最大音量时在[-1,-9] DBFS之间(3)双回采平均幅度差≤3db3、通道顺序稳定性检查多次录音, 同一个mic对应软件中的声道要固定。可以多次录音按相同顺序用手轻触麦克风,录音上会有比较明显的振幅,检查多次录音的麦序4、底噪检查(1)不播放音乐时,回采底噪<-65dbfs安静环境下,设备底噪 < -50dbfs操作方法:最右侧数字区域鼠标右键选择Decibels(2)运行时底噪检查(设备运行时自噪较大的设备才需要测,比如投影仪运行时有风扇噪声,扫地机工作时的噪声,其他免测。)让设备运行应用,使cpu占用>70%, 此时用声压计测量mic处噪声≤50db5、丢数据检查查看音频的长度(Duration)是否为21.6秒丢数据可能原因:(1)重采样算法异常(2)驱动异常2.在频谱上找一竖一竖的地方, 看时域波形采样点是否减少,如下图的频域波形,对应的时域少了5个采样点6、最大音量检查设备最大音量播放音频进行测试。AEC算法消除量为30db左右, 建议麦克风口处最大音量<=85dB,打断唤醒效果较好特殊场景,例如全双工, 建议麦克风口处最大音量<=75db,打断唤醒效果较好7、回采信号检查(1)回采信号提前于mic信号,时间差<80ms(2)每次录制时,回采和MIC时延差稳定(3)回采与原信号波形基本一致,无畸变(4)回采不能截幅反例: (1)回采比MIC慢(2)回采和MIC信号的时间差太长(3)电视盒子外接电视的喇叭,时延差不可控,效果会受很大的影响8、波形失真原因:音量太大导致失真质量测试音频原始波形(下图)设备回采波形失真(下图)注:轻微型波形失真也算失真9、单双回采检查如果有2个喇叭,2回采信号效果更好10、喇叭主观听感测试方法:最大音量播放0dB 20Hz-20kHz的扫描信号,有无POP噪声/失真感/破音/共振音/杂音11、麦克风阵列角度检查二、相位一致性检查(单麦免测)正常情况:麦克风同一时刻的相位一致(波形一致)回采同一时刻可以一致或者反向检查方法:找原始音频正弦波的位置进行检查异常情况三、密封性和通道顺序测试1、录制音频 1.音箱和待测设备距离20~30cm 2.音箱播放,调节音量使待测设备麦克风(Mic)处音量为80~90dB(估算) 3.设备录音并保存文件,命名为 sealing_test.pcm 4.使用EVA海绵胶带10mm厚度(淘宝可购买)按逆时针顺序逐个密封mic,密封后停顿5~10秒,然后换下一个mic堵住继续该操作至结束。2、 导入音频文件1.结束录音,导出录音文件,确保格式为wav。2.拖动文件到audition软件中,根据设备情况选择采样率和声道数由于白噪声能量较高,可以清楚看到被堵mic的频段,同时也能看到mic的顺序。如下图所示,实际mic顺序和测试顺序一致,时域谱中每个通道振幅明显较大的部分(或者频域谱中每个通道中暗的部分)即为被堵住mic的部分。3.、对比声道振幅 1.单击鼠标左键不松开,拖动选择区域后松开鼠标左键, 选中声道1中堵住mic停顿5s~10s区间的部分 注意:在选择扫描选区的时候,请选择停顿 5~10s 的中间的平坦部分,不要将有信号残留的部分选中,这部分会影响最后的结果! 2.依次点击窗口(Window),振幅统计(Amplitude Statistics),扫描选区(Scan Selection) 3.查看平均RMS振幅(Average RMS Amplitude),声道1密封 -57.26dB,其他声道未密封为-28dB,差值30dB>气密标准10dB,单声道气密性合格。要求设备所有mic气密性合格反例:第2和第6声道气密性不合格四、算法效果测试使用降噪测试工具处理保存的质量测试音频,检查降噪后的音频回声残留量,残留噪声低于-30dbfs以上,是整个声学部分自测的全部流程。
-
我们先讲一下智能硬件做语音识别的基本链路:声音(目标声音和噪音)一起被智能硬件的麦克风(阵列)采集到,在智能硬件的芯片上通过预处理之后,然后再送往云端进行ASR(语音转文字)。而很多智能硬件识别效果不好的主要原因是因为预处理,也就是声学处理没有做好,才导致识别效果不好。就像人耳朵一样,没听清楚讲话内容,可不得乱猜一通!现在,云端的语音识别(ASR)可以通过SDK/API进行调用,大厂提供的识别接口背后所使用的算法和效果基本都差不多。毕竟,开源算法和大数据训练一起结合,在安静场景下,或者说送给云端一段干净的音频,准确率保持在98%以上都没有任何问题。识别效果不好,问题出就出在了声学处理上。如果声学处理没有做好,送给云端的就是一段带噪声的音频,如果是人与人通话还好,毕竟人的判别能力很强。但如果给语音识别算法来处理噪声没有处理好的音频,输出的结果就会差强人意,而且,即便如何优化云端识别算法,像热词、大模型下打小模型这些做法,依然不能有效优化识别的准确率。那要如何才能做好智能硬件的声学处理呢?首先,我们要了解,麦克风(阵列)采集到的声音里面都有那些音源。从组成类型来看,包括:目标人声音:希望提出出来转成文字的语音,越干净越好,专业术语是信噪比(SNR)越高越好,至少5dB及以上;混响声音:主要是在室内,目标人讲话的声音通过墙壁、地板、天花板等反弹之后的声音,类似山谷里面的回声;背景音:目标人所在环境的一些噪音,如室外的鸣笛声、风噪、行人交谈声音;室内常见的是电视播放的声音、风扇空调工作声音等等;设备自发声:如音箱播放的音乐声,机器人的语音播报声等等。然后,根据不同的类型音源,就需要采用不同的算法来进行处理。设备自发声,可以通过回声消除算法来进行解决,通过设计硬回采电路,把喇叭的声音连回麦克风,叠加相反的波形实现设备自发声的消除。不过,要想回声消除效果好,在做结构设计的时候,建议喇叭和麦克风离得越远越好。部分芯片支持软回采,也就是硬件方案上不用单独设计回采电路,不过,从效果上来看,硬回采优于软回采。混响声音,可以通过去混响算法进行解决。一般来说,基本的去混响算法就可以达到不错的效果,不过,对于一些复杂的环境,去混响的算法尽可能在实际场景中进行实验和调试,以保证最佳效果。还要注意的是,去混响之后,对本身音频也会产生副作用,如失真或声音质量降低,这些不利的影响也要纳入整体效果的考虑中来。背景音,就需要用到预处理中的最重要的降噪算法了。降噪一般分为通话降噪和环境降噪,最简单的区分是通话降噪后的音频是给人听的,环境降噪后的音频是喂给语音识别模型的。人的判断力远远强于语音识别模型,因此,环境降噪的要求比通话降噪高得多。但是,越难的地方也越容易被应付,很多智能硬件的项目,要么觉得降噪不重要,要么觉得做降噪的时间成本和金钱成本都太高而应付了事,最终,却因为产品效果之后售后投诉太多反而得不偿失。那么,要怎么样才能做好降噪呢?从工程和产品来说,要做好以下三件事:第一件事,确定场景和要求。比方说,主要使用的场景是哪里,室内和室外所要面临的降噪要求就完全不同。同时,还要确定要求有多高,是近场交互还是远场交互,需要多少颗麦克风的阵列,理论上讲,麦克风的数量越多,对芯片的算力要求越高,产品的成本也就越高,成本太高是否要向利润妥协,产品的目标用户能支持多高的价格区间等等,这些都是需要在项目立项的时候有基本的数据指标。第二件事,找算法原厂沟通。一定要找算法原厂沟通,用芯片自带或者降噪模组,最后的理想的结果就是产品能用但不那么好用,甚至很多产品量产后根本就没办法用。硬件项目的周期一般小则半年,长则二三年,因为降噪的原因而失败就得不偿失了。最最关键的是,降噪效果还不能后期通过软件OTA来进行升级,因为之前做ID设计和硬件设计的时候,降噪效果的天花板就已经确定了,算法如何调优都是徒劳。找算法原厂沟通,了解清楚麦间距、性能指标、芯片算力占用情况、功耗、适配周期、麦克风喇叭选型指标、硬件结构设计细节规范等等,才能真正保证后期产品的使用效果。第三件事,实验室系统测试。没有测试就投产绝对是在搞破坏,声学这一块,同样需要进行系统科学的测试,评估满足量产标准后再进行量产,否则就应该按照测试结果进行整改。实在无法整改的部分,与算法原厂沟通性能恶化情况,可接受范围内可继续量产,不可接受范围内,一定要及时叫停进行整改。否则,一旦量产后,就再无回头路可言。而声学方面,实验室系统测试的数据,包括以下部分:麦克风:频率响应、底噪、灵敏度、信噪比、总谐波失真、密封性、阵列频响一致性等喇叭测试:频率响应、总谐波失真、R&B、灵敏度等。当然,有些指标不需要到实验室测试,自测也能发现问题。
-
基于QT for andriod添加第三方库的时候一直调用失败,找不到函数的定义
-
实时语音识别技术将语音、自然语音理解、语音合成等技术应用在公安部门的工作中,场景为笔录制作,电话报警语音识别,语音转写文字等。对于公安民警在案件处理时,需要与案件相关人员对话了解案情,清楚记录何时、何人、何事,等相关重要信息。以往传统的笔录制作需要两名警员,一个负责记录,一个负责询问,记录依靠笔记。随着时代的发展,用电脑代替了打字。虽然改变了传统的记录方式,但电脑打字记录还是会消耗大量的人力和修改的工作量,询问时还要兼顾记录人员的打字速度。笔录整理还需记录员的总结能力,对询问内容总结出主旨,形成一份合格的笔录文档。通过结合实时语音识别技术和自然语言理解技术,当询问笔录开始制作时,实时办案民警与被询问人之间的对话内容进行识别,并将识别到的内容按照语法和自然语言调整识别结果。自然语言理解技术还可以将语音中出现的语气词自动过滤,对关键词类型提取,最终输出正确、精练的文字。将生成的识别结果与原始识别数据进行比对,回听音频文件对文档归纳总结,简单修改即可按照笔录模板输出笔录。使公安了解案情时,笔录制作更方便快捷,减少人员精力投入,提高笔录制作的效率,辅助公安办案业务的完成。公安部门在审讯时常常会收集到很多有价值的信息,关键词识别技术能够为公安侦查破案提供技术支持和帮助。作为破案的关键性信息,如地址、涉案人员信息等,关键词识别技术分析问答内容,提取关键数据,并对文字结果特殊显示。从视觉上更直观的关注到重点、有价值的信息,提醒办案人员。实时语音识别技术中的离线转写功能能够将民警外出办案记录的录音文件或视频文件转写成文字,满足多文档同步识别转写,转写速度快的功能。民警不用跟着录音边听边整理,提高笔录整理的效率。应用在快速记录询问笔录,可根据公安办案业务流程和工作习惯,中增加法律条款的查询等。当需要告知被询问人法律法规时,通过文本朗读功能代替人为宣读,减少办案人员精力投入,提高办案效率,推动公安业务与智能化手段融合。
-
什么是语音语音指的是人类通过发声器官发出来具有一定意义、用来沟通交流的声音。计算机中语音存储:以波形文件的方式存储,通过波形反映语音的变化,从而可以获取音强、音长等参数信息。音域参数:傅利叶谱、梅尔频率到谱系数,主要用来提取语音内容以及音色的差别,用来更进一步辨别语音信息。什么是语音识别语音识别简单来说就是把语音内容自动转换为文字的过程,是人与机器交互的一种技术。涉及领域:声学、人工智能、数字信号处理、心理学等方面。语音识别的输入:对一段声音文件进行播放的序列。语音识别的输出:输出的结果是一段文本序列。语音识别的原理语音识别需要经过特征提取、声学模型、语音模型、语音解码和搜索算法四个部分。特征提取:把要分析的信号从最原始信号提取出来,这个阶段主要是对语音的幅度标准化、频响校正、分帧、加窗、始末端点检测等预处理操作,为声学模型提供需要特征向量。声学模型:依靠声学模型进行语音参数分析(语音共振峰频率、幅度等)和对语音的线性预测参数进行分析。语言模型:根据相关语言学理论,计算出声音片段可能词组序列的概率。语音解码和搜索算法:根据声学模型+发音词典+语音模型构建的搜索空间,找到最合适的路径。解码完成后最终输出文本。语音识别系统的组成一个完整的语音识别系统包括:预处理、特征提取、声学模型训练、语言模型训练语音解码器。预处理对输入的原始声音信号进行处理,过滤掉其中的背景噪音、非重要信息,还要对找到语音信号的开始和结束、语音分帧、提升高频部分的信号等操作。最常用的特征提取方法为梅尔顿到谱系数(MFCC),因为它拥有良好的抗噪性和健壮性。声学模型训练根据悬恋语音库的特征参数训练出声学模型参数,从而可以在识别时与声学模型进行匹配得到相应结果。目前主流语音识别系统一般都会采用HMM进行声学模型建模。语言模型训练用来预测哪个词序列正确的可能性更大。语音解码器解码器也就是语音识别技术中的识别过程,根据输入的语音信号,然后和训练好的HMM声学模型、语言模型、发音字典建立一个搜索空间,根据搜索算法找到最合适的路径。从而找到最合适的词串。语音识别的使用场景语音识别在日常生活中使用非常广泛主要分为封闭式和开放式应用。封闭式应用:主要指针对特定控制指令的应用。
-
什么是语音语音指的是人类通过发声器官发出来具有一定意义、用来沟通交流的声音。计算机中语音存储:以波形文件的方式存储,通过波形反映语音的变化,从而可以获取音强、音长等参数信息。音域参数:傅利叶谱、梅尔频率到谱系数,主要用来提取语音内容以及音色的差别,用来更进一步辨别语音信息。什么是语音识别语音识别简单来说就是把语音内容自动转换为文字的过程,是人与机器交互的一种技术。涉及领域:声学、人工智能、数字信号处理、心理学等方面。语音识别的输入:对一段声音文件进行播放的序列。语音识别的输出:输出的结果是一段文本序列。语音识别的原理语音识别需要经过特征提取、声学模型、语音模型、语音解码和搜索算法四个部分。特征提取:把要分析的信号从最原始信号提取出来,这个阶段主要是对语音的幅度标准化、频响校正、分帧、加窗、始末端点检测等预处理操作,为声学模型提供需要特征向量。声学模型:依靠声学模型进行语音参数分析(语音共振峰频率、幅度等)和对语音的线性预测参数进行分析。语言模型:根据相关语言学理论,计算出声音片段可能词组序列的概率。语音解码和搜索算法:根据声学模型+发音词典+语音模型构建的搜索空间,找到最合适的路径。解码完成后最终输出文本。语音识别系统的组成一个完整的语音识别系统包括:预处理、特征提取、声学模型训练、语言模型训练、语音解码器。预处理对输入的原始声音信号进行处理,过滤掉其中的背景噪音、非重要信息,还要对找到语音信号的开始和结束、语音分帧、提升高频部分的信号等操作。特征提取最常用的特征提取方法为梅尔顿到谱系数(MFCC),因为它拥有良好的抗噪性和健壮性。声学模型训练根据悬恋语音库的特征参数训练出声学模型参数,从而可以在识别时与声学模型进行匹配得到相应结果。目前主流语音识别系统一般都会采用HMM进行声学模型建模。语言模型训练用来预测哪个词序列正确的可能性更大。语音解码器解码器也就是语音识别技术中的识别过程,根据输入的语音信号,然后和训练好的HMM声学模型、语言模型、发音字典建立一个搜索空间,根据搜索算法找到最合适的路径。从而找到最合适的词串。
-
动态读取不同sheet页的数据,但是不能指定sheet
-
算法能力描述调用方式接口详细说明一句话识别一句话识别接口,用于短语音的同步识别。一次性上传1min以内音频,能快速返回识别结果。POST链接Websocket链接录音文件识别录音文件识别接口,用于识别长录音文件。POST链接GET链接语音合成语音合成,是一种将文本转换成逼真语音的服务。用户通过实时访问和调用API获取语音合成结果,将用户输入的文字合成为音频。通过音色选择、自定义音量、语速,为企业和个人提供个性化的发音服务。POST链接分类文档链接备注华为云在线课程语音处理理论、应用与实验(免费)链接本课程就语音处理的理论及应用做了介绍,介绍了大量具体的语音识别与语音合成的模型,不同模型各有特点,适应于不同的应用场AI技术应用场景--语音识别(收费)链接语音识别技术的应用在我们的日常生活中非常常见,人机交互、智能家居、智能问答等等,本课程将从语音识别的基础出发,带领大家一步步深入语音识别技术的内在机制,帮助大家讲语音识别技术快速落地到实际的应用场景中。
-
一、简单说点 因为手头有一个项目,该项目需要在香橙派上实现语音控制,并且带有语音唤醒功能。简单来说,就是通过唤醒词唤醒香橙派,然后说出相关指令,香橙派去执行指令。 但是,在弄香橙派的时候,自带的麦克风不好使了,单独进行麦克风测试的时候是好使的,但是程序跑起来怎么说话都没反应了。买了个USB接口的麦克风,还没到,就先在ubuntu系统上先试试流程,跑通下,到时在香橙派上弄的时候心里也有个数了。 这是这篇记录博客的由来了。开发语言使用的Python,不得不说,使用Python来进行语音识别,是真的方便,第三方库太强大了。基本上是把环境配置好,剩下简单写点流程逻辑代码就完成了。 emmm,对了,为了防止在复现过程中出现一些莫名其妙的bug,每一个环境的配置,还有Python包我都会附上相应的版本号,理论上来说按照流程来走应该是没什么问题,中间的坑我都踩的差不多了。好了,闲话说到这,进入正文。 Ubuntu: 20.04 Python: 3.8 二、相关技术介绍 语音唤醒使用的是Snowboy,这个官方已经不维护了,最后一个版本是1.3.0,官方的自定义语音唤醒词训练的网站已经停掉了,不过还有第三方的网站可以用。 语音转文字使用的Speechbrain,这个可以自己训练自己的相关模型,为了提高自己指令识别精度可以这么做。要省事可以使用官方提供预先训练好的模型。 文字转语音使用的Pyttsx3,这个怎么说,用来做demo程序是绝对够用了,但如果想要更好体验,需要解决下音色的问题。 三、语音唤醒 版本号:1.3.0 Snowboy的GitHub地址: https://github.com/Kitt-AI/snowboy 1 如果在GitHub上下载压缩包的源码,那么我们需要先进行解压: tar xvf snowboy-1.3.0.tar.gz 1 当然,我们也能直接使用git命令进行下载源码: git clone https://github.com/Kitt-AI/snowboy.git 代码下载完成后,先留着备用,接下来我们配置代码所需要的环境,snowboy需要swig,alsa等等,直接看配置: sudo apt-get install swig 版本号:4.0.1 sudo apt-get install libatlas-base-dev sudo apt-get install sox 版本号:14.4.2 sudo apt-get install libasound2-dev 这个里面,sox少了会怎么样,我没测试过,不知道sox会不会对snowboy的编译造成直接影响,起码可以通过 sox -d -d 命令来测试你的麦克风跟外放,执行命令之后,对着麦克风说话,你可以听到自己的声音。 libasound2少了会出问题,这个我一开忘了安装,结果报错了。这个是snowboy的C++编译中下载portaudio这个库的时候会用到,如果执行下载portaudio的操作前没有安装libasound2,会报下面错误:"Fail to open PortAudio stream, error message is “Device unavailable”。 还有,需要注意的是,swig的版本号要大于3.10(没记错的话,不然就是3.12 <-_<- ) 环境弄好之后,我们进入下载好的snowboy文件中,就可以进行相关编译工作了。 这里先说下,Snowboy的C++编译操作。 进入下面目录: cd examples/C++/ 1 然后,进行安装portaudio,还是当前路径下: ./install_portaudio.sh 1 安装完成之后,进行编译操作: make 1 如果是在Ubuntu20.04的环境下,是没什么问题的。其他环境,可能会报一个如下错误:/usr/bin/ld: …/…//lib/ubuntu64/libsnowboy-detect.a:error adding symbols:file in wrong format 这个时候,我们只需找到当前目录下的demo.mk文件,修改如下内容(第37行): 修改前: SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/ubuntu64/libsnowboy-detect.a 修改后: SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/aarche64-ubuntu1604/libsnowboy-detect.a 修改完成后,在执行make。(可以在make之前,执行下make clean,清楚下上次编译文件) 编译完成之后,我们就行执行demo程序了: ./demo 1 demo程序默认的唤醒词是snowboy。唤醒之后控制台会输出:Hotword 1 detected!。我们也可以对demo程序进行修改:在代码中打印前加上一句system(“play resources/ding.wav”),这样在识别到唤醒词时会自动播放一个叮的声音。 demo程序运行完之后,我们可以仿照demo程序,进行自己的二次开发,加入唤醒之后需要进行的操作。因为我用的Python语言,后面我会给出Python的相关需要修改得部分,这里的修改也可以参考Python部分的。 Snowboy的Python编译: 安装相关环境: sudo apt-get install swig 版本:4.0.1 sudo apt-get install libatlas-base-dev 注意:这两个包如果在C++编译那里安装了,这里就不用重复安装了。 接下来安装pyaudio sudo apt-get install portaudio19-dev python-all-dev python3-all-dev jackd1 portaudio19-doc jack-tools meterbridge liblo-dev sudo apt-get install pyaudio 这里需要注意一个点,安装pyaudio之前一定要先安装前面那部分环境,因为pyaudio需要依赖portaudio,这里如果报错了,注意一下吧,亲身经历。 如果还报什么依赖问题,把下面这个执行一下(这里跟上面有些是重复的,删除重复的就行): sudo apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0 环境备好之后,进入: cd swig/Python3 进入之后,编译: ./make 这里如果出现错误:/usr/bin/ld: …/…//lib/ubuntu64/libsnowboy-detect.a:error adding symbols:file in wrong format 我们打开当前路径下的makefile文件,进行如下修改: 修改前: SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/ubuntu64/libsnowboy-detect.a 修改后: SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/aarche64-ubuntu1604/libsnowboy-detect.a 如果没错误,就不用管了。编译完成之后,我们就可以进入目录: cd examples/Python3 1 来运行官方demo了,不过运行之前,我们需要该一个文件: 打开当前路径snowboydecoder.py文件,将: from * import snowboydetect 修改为import snowboydetect 1 修改完之后,我们运行: python3 demo.py resources/models/snowboy.umdl 1 唤醒词为snowboy,唤醒之后会有叮的一声。 根据demo程序,来进行二次开发 接下来,创建一个python虚拟环境(最好这样,后面在安装一些python包的时候防止跟本地的一些包冲突)。我们snowboy编译之后的如下文件: resources文件夹;demo.py ; snowboydecoder.py ;snowboydetect.py; _snowboydetect.so (_snowboydetect.so 在swig/Python3的目录下) 1 2 将上面文件都放到我们新创建的目录下,运行demo.py没问题后,我们在来对创建自己的语音唤醒代码: import snowboydecoder import signal interrupted = False def signal_handler(signal, frame): global interrupted interrupted = True def interrupt_callback(): global interrupted return interrupted # 语音唤醒之后播放的应答 model = 'resources/models/snowboy.umdl' # 终止方法为ctrl+c signal.signal(signal.SIGINT, signal_handler) # 这里可以设置识别灵敏度 detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5) print('Listening... Press Ctrl+C to exit') def callback(): print("唤醒之后的回调函数") print("在这里实现唤醒之后需要进行的操作") detector.start(detected_callback=callback, # 自定义回调函数 interrupt_check=interrupt_callback, sleep_time=0.03) # 释放资源 detector.terminate() 好了,这样就能把语音唤醒给运用起来了。snowboy的相关说明到这就结束。 哦,不对,差点忘了,如果想训练自己的唤醒词,可以在下面这个网站训练,上传三段自己录制的唤醒词语音就行,唤醒识别精度跟你上传的语音有很大关系: https://snowboy.hahack.com/ 1 四、语音转文字 获取语音 想要实现语音转文字,首先,我们得获取用户的语音输入。这里使用Python的speech_recognition包来进行语音获取,使用这个的好处是,他会在用户说话结束时,自动停止语音获取,这里我们就不用自己去写该什么停止语音获取的逻辑了,这点我认识是相当爽。 speech_recognition包的版本号:3.8.1 在安装speech_recognition包前我们还需要安装相应的依赖资源库: PS. Python版本需为2.6或2.7或3.3+ pip install PyAudio 版本号:0.2.11 ps.这里跟上面使用apt-get安装的pyaudio是不一样的,这个安装是当前项目下 PS. PocketSphinx这个包可以暂时不安装,先看看能不能跑通,我安装这个是我一开始也试了使用 里面的recognition_sphinx()来进行语音识别,结果发现效果不太好,就放弃了。但我现在不清楚这个 有没有对后面安装产生什么影响,这个包我记得蛮大,可以暂时不安装,先试试后面流程再说。 pip install PocketSphinx 版本号:0.1.15 如果安装失败,那就是少了下面的一些依赖: apt-get install libasound2-dev bison sudo apt-get install pulseaudio sudo apt-get install libpulse-dev sudo apt-get install osspd 上面完成之后,安装: pip install SpeechRecognition 版本号:3.8.1 1 然后,我们可以通过下面代码来验证语音的获取: import speech_recognition as sr #从系统麦克风拾取音频数据,采样率为 16000 def rec(rate=16000): r = sr.Recognizer() with sr.Microphone(sample_rate=rate) as source: print('正在获取声音中...') audio = r.listen(source) with open("recording.wav", "wb") as f: f.write(audio.get_wav_data()) print('声音获取完成.') return 1 if __name__ == '__main__': rec() 如果在当前项目目录下得到了recording.wav文件,并且播放正常的话,那就没问题了。 语音转文字 语音转文字使用speechbrain 安装: pip install speechbrain 版本号:0.5.11 pip install SoundFile 版本号:0.10.3.post1 pip install sox 版本号:1.4.1 1 2 3 这个识别默认是英文识别,我们可以使用官方的预先训练好的中文模型,官网地址: 官网地址:https://speechbrain.github.io/ GitHub仓库地址:https://github.com/speechbrain/speechbrain 1 2 我这里下载好了: 下载地址:https://download.csdn.net/download/qq_44323019/85399454 1 原来上传资源可以关闭自动调整积分。。。上面链接我设置的0积分,免费下载。 下载解压之后,会得到一个pretrained_models文件夹,把这个文件夹放到当前目录的根目录即可。 测试代码: from speechbrain.pretrained import EncoderDecoderASR import torch import torchaudio def voice_into_word(): asr_model = EncoderDecoderASR.from_hparams(source="speechbrain/asr-transformer-aishell", savedir="pretrained_models/asr-transformer-aishell") audio_1 = r"./test.wav" ddd = torchaudio.list_audio_backends() print('start...') snt_1, fs = torchaudio.load(audio_1) wav_lens = torch.tensor([1.0]) res = asr_model.transcribe_batch(snt_1, wav_lens) word = res[0][0].replace(' ', '') print(word) return word if __name__ == '__main__': voice_into_word() ok,到这里我们能将语音转文字,得到文字之后,那我们能操作的空间就大。 五、指令识别 这一部分其实没什么可说的,如果只是简单的指令识别,只要判断上一步我们得到的语音转成的文字部分有没有我们指令的关键字,然后再向用户确定一下就ok了。 其实这里我们还行实现语音聊天机器人功能。我们上一步不是得到了文字吗,这里只要我们能接一个聊天机器人接口就行了,比如图灵机器人。这里我没这个需求,有需求的可以自己去搜索,直接调用就行了。 六、文字转语音 要完成一个完整对话,当然少不了我们的终端也需要“说”了。这里我们使用pyttsx3来实现说的功能。 先安装: sudo apt install libespeak1 pip install pyttsx3 1 2 PS.这里说一句,单纯安装pyttsx3大概率是不行的,我当时是莫名其妙报了一大堆错,都蒙了,后面是在一个论坛上面看到需要libspeak这个。 安装完成之后,测试代码: import pyttsx3 def speakout(workText): engine = pyttsx3.init() # 获取发音人 voices = engine.getProperty('voices') #这里可以获取你设备当前支持的发音,可以配置下面代码使用,我这里使用zh偷懒了 engine.setProperty('voice', 'zh') # 开启支持中文 rate = engine.getProperty('rate') engine.setProperty('rate', rate-40) #控制发音语速,可以自己调 # 设置音量 范围为0.0-1.0 默认值为1.0 engine.setProperty('volume', 0.7) engine.say(workText) engine.runAndWait() speakout('你好哇') 七、其他一些 到这里应该是结束了,语音唤醒,语音识别,文字转语音都有了,整套流程是通了,更深入的就需要自己慢慢去琢磨了。我这里给出我整个项目安装过的包,防止上面我有漏写了的。其中一些包肯定是用不到的,因为中间我尝试了好几种方案,所以安装过其他一些包。只做参考。 Package Version ------------------ ------------ certifi 2021.10.8 cffi 1.15.0 charset-normalizer 2.0.12 filelock 3.7.0 huggingface-hub 0.6.0 HyperPyYAML 1.0.1 idna 3.3 joblib 1.1.0 numpy 1.22.3 packaging 21.3 pip 22.1 pocketsphinx 0.1.15 PyAudio 0.2.11 pycparser 2.21 pyparsing 3.0.9 pyttsx3 2.71 PyYAML 6.0 requests 2.27.1 ruamel.yaml 0.17.21 ruamel.yaml.clib 0.2.6 scipy 1.8.0 sentencepiece 0.1.96 setuptools 62.2.0 SoundFile 0.10.3.post1 sox 1.4.1 speechbrain 0.5.11 SpeechRecognition 3.8.1 torch 1.11.0 torchaudio 0.11.0 tqdm 4.64.0 typing_extensions 4.2.0 urllib3 1.26.9 wheel 0.37.1 到这里了,如果对你有帮助,点个小小的赞吧。头一次一篇博客分了两天来写。 ->_<- ———————————————— 版权声明:本文为CSDN博主「@Mrxu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_44323019/article/details/124808289
-
随着科技的发展让机器听懂人类语言已经成为现实这其中的奥秘就是——语音识别技术 语音识别已渐渐融入到我们的生活当中它让我们的生活变得更便捷、更高效、也更智能本期趣味实验有关语音识别的基于MindX SDK的中文语音识别推理实验 一起来看看吧!实验介绍本实验将通过创建基于昇腾310处理器的推理环境,使用两个离线推理模型Conformer和Transformer模型,借助MindX SDK mxVision 将中文语音数据集识别成对应的文字,实现中文语音识别的功能。实验大纲◆ 实验背景◆ 实验介绍◆ 实验环境准备◆ 数据与模型◆ 项目介绍◆ MindX SDK开发 :转换离线模型及插件开发◆ MindX SDK开发 :业务流程编排◆ MindX SDK开发 :编写应用代码◆ 课后实践实验教程点击查看完整实验教程欢迎在下方评论区留言讨论您可以在这里展示您的DIY成果!同时欢迎大家推荐demo~
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签