文章目录

  • ASRT 环境配置
  • 前端音频处理
    • 音频文件格式标准
    • 音频采集流程
  • 命令关键字识别
    • 主要有三部分
    • 大概流程

示例demo asrt-vue-demo

ASRT 环境配置

  • 项目地址 https://github.com/nl8590687/ASRT_SpeechRecognition
  • 服务端下载地址 https://wiki.ailemon.net/docs/asrt-doc/download
  • ASRT语音识别工具文档

用的ASRT提供的http服务,对应文件为 asrserver_http.py默认端口20001,没有配置跨域,跨域这边我用nginx跨域代理了还是不行,最后直接用flask-cors 在服务端解决

可以说,最麻烦的就是环境配置这块了,

说一下我两台设备安装的经历吧
设备A windows11 + i5-10200H + GTX 1650
设备B windows11 + i7-12700H + RTX 3060
第一天: 设备A安装,NVIDIA控制面板CUDA驱动版本为11.1.114,我就去安装了11.1版本的CUDA,官网CUDA Toolkit 11.1.1 只有windows10,我试了下,结果安装失败,我就点x了,试了下启动http服务脚本,结果启动成功了,可以正常调用接口识别 (现在想来可能是以cpu模式运行了)
回去以后用设备B安装,CUDA驱动版本为11.7.1,直接安装对应版本的CUDA了,安装成功,但是启动找不到很多东西,于是直接按照柠檬教程走了,vs c++,对应CUDA版本的cuDNN 一套整上,此时离谱的就来了,启动http服务仍然很多dll找不到,但是这些dll确实是存在的,最后看到这篇文章评论区解决https://blog.csdn.net/qq_41112170/article/details/121878288 , 降级到2.8版本的cuDNN成功跑起!
第二天: 设备A再次启动asrt http,启动失败,很多dll找不到… 于是安装 CUDA 11.7.1 + cuDNN 2.8解决

直接安装cpu版本的tensorflow 就不用安装CUDA相关的了,但是速度上差异还是比较大的,下面两图是我在设备A测试的,同一条音频,上 cpu 下 gpu


补充参考: 设备三 无NVIDIA 显卡,cpu为 Intel Xeon Silver 4210R, 一次请求平均耗时500ms,接入项目测试延时感知不强

前端音频处理

音频文件格式标准

  • 文件格式:wav格式文件,文件名通常以.wav结尾
  • 文件头标记:diff文件头 (暂时不理解这个
  • 采样频率:16 kHz,对应参数为16000
  • 声道数:单声道
  • 采样位宽/字节宽度:16 bits的采样位宽, 或2 bytes 样本点的字节宽度(2 bytes * 8 bit/byte = 16 bits), 256 bps 采样比特率 (pcm或raw格式都可以,只要格式正确、能够正常读取到内容即可)

音频采集流程

参考 ASRT语音识别体验Demo
需要引入一个 recorder.wav.min.js 用于录音
注: 非本地环境需要HTTPS才能录音

  1. 创建 Recorder 实例
rec = Recorder({// 类型type: "wav",// 采样频率sampleRate: 16000,// 采样位宽bitRate: 16});
  1. 开始录音
    注: open是个异步函数,open后调用start即可录制
rec.open(rec.start)
  1. 结束录音
// blob: 音频文件
// duration: 时长ms
rec.stop(function(blob, duration) {// ...
})

4.封装请求数据

const reader = new FileReader();
reader.onloadend = function() {econst data = {'channels': 1,'sample_rate': 16000,'byte_width': 2,'samples': (/.+;\s*base64\s*,\s*(.+)$/i.exec(reader.result)||[])[1]}// fetch ajax...
}
reader.readAsDataURL(blob)

命令关键字识别

首先定义, 一条完整的命令 = 命令 + 参数

如 打开菜单, 打开即命令,菜单即参数

因此,只要识别出语句中含有的命令+参数就就可以知道执行什么命令了,

帮我打开菜单,我要打开菜单都是打开菜单

当然这也有个问题,就是三秒后打开菜单也会被识别成打开菜单,这样的话一条完整的命令应该 = 执行条件 + 命令 + 参数 了,目前还不考虑这种情况!

主要有三部分

  • 字典: 定义拼音所有可识别的文字
export const dict = {}
dict['an'] = '安'
dict['cai'] = '菜才采'
// ...
  • 命令: 定义命令及其对应的关键字
    这里考虑的是一个命令可能对应多个关键字
 export const commands = new Map()commands.set('open', ['打开'])commands.set('target', ['定位', '跳转'])
  • 参数: 定义命令对应的参数(这里参数即关键字,关键字即参数)
export const commandsParam = new Map()
commandsParam.set('open', ['菜单', '导航', '标图标绘'])
commandsParam.set('target', ['中国', '陕西', '西安', '雁塔区', '吴忠', '定西'])

大概流程

  1. ASRT 使用 /speech 接口获取语音的拼音,如 [‘da3’,‘kai1’,‘cai4’,‘dan1’]
    这步有时候拼音对了声调不对,所以处理词典的时候不考虑音调以提高准确率

  2. 前端通过自定义的词典获取可能存在的文字 如 [‘打’, ‘大’, ‘开’, ‘楷’, ‘菜’, ‘才’, ‘单’, ‘跳’, ‘转’]

// speechs 接口返回的拼音集合
export const resolveWords = function(speechs) {let result = ''speechs.forEach(item => {result += dict[item.substring(0, item.length - 1)] || ''})return result
}
  1. 根据解析出来的文字 对 命令相关的关键词进行权重分析得到权重最高的命令 如 open
export const resolveCommand = function(words) {// { 命令 => 权重 }const weightMap = new Map()commands.forEach((_, key) => weightMap.set(key, 0))let result = nullArray.from(words).forEach((word, key) => {for (const item of weightMap) {const commandKeywords = commands.get(item[0]).join('')if(commandKeywords.includes(word)) {const w = item[1] + 1weightMap.set(item[0], w)if(!result || result[1] < w) {result = [item[0], w]if(w >= (words.length / 2)) {break}}}}})return result ? result[0] : ''
}
  1. 如果有命令,就通过解析出来的文字对命令参数进行权重分析得到参数
    跟命令权重分析差不多, 这里遍历文字的时候从后往前,因为一般都是命令+参数,从后往前减小命令关键字对权重计算的影响
export const resolveCommandParams = function(command, words) {const params = commandParams.get(command)if(!params) return// { 命令参数 => 权重 }const weightMap = new Map()params.forEach(item => weightMap.set(item, 0))let result = null// 从后往前,减小命令关键字对参数计算的影响Array.from(words).reverse().forEach((word, key) => {for (const key of weightMap) {if(key[0].includes(word)) {const w = key[1]+1weightMap.set(key[0], w)if(!result || result[1] < w) {result = [key[0], w]if(w >= (words.length / 2)) {break}}}}})return result ? result[0] : ''
}
  1. 执行命令
const executeCommand = function(command, params) {switch(command) {case 'open':console.log('执行命令: 打开' + params);break;case 'target':console.log('执行命令: 定位' + params);break;default:console.warn(`命令${command}不存在`)}
}

目前总的字典数和关键字越少精确度就越高,欢迎大佬给这个算法指点一二啊!!!

离线命令词识别 (基于ASRT HTTP)相关推荐

  1. 离线语音识别软件_6.语音板使用科大讯飞离线命令词识别

    0x00 离线命令词识别简介 语音识别技术(Auto Speech Recognize,简称ASR),就是把人的自然语言音频数据转换成文本数据的技术.理论上在线ASR是可以把所有的语音转换成对应的文本 ...

  2. 【C++】QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例)

    QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例) 1.说明: 跨平台调用dll出现各种坑,谨以此文避坑. 参考博文:https://www.cnblogs.com/seer/p/4789 ...

  3. 讯飞语音——离线命令词识别

    离线命令词识别 效果图 示例源码 地址:http://download.csdn.net/detail/q4878802/9023825 步骤: 1. 下载SDK 前面文章有,就不在复述了.这里要选择 ...

  4. 科大讯飞离线命令词识别

    一.进入科大讯飞官网,下载自己所需要的SDK----以离线命令词识别为例: 二.分析代码-----主要有以下四大函数 const char *get_audio_file(void); //选择进行离 ...

  5. 科大讯飞离线语音命令词识别的使用说明

        最近因为项目的需求,需要在无网络的情况下实现语音识别的功能,因为之前在线识别一直用的科大的,所以经理就和我说,你花半天时间简单熟悉一下,然后出一个Demo,下午有人过来看:因为之前科大在线SR ...

  6. 讯飞离线语音命令词识别

    讯飞离线语音命令词识别 强烈推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来! 网址:http://www.captainbed.net/yancyang ...

  7. 讯飞语音——离线命令词+语义识别

    讯飞语音--离线命令词+语义识别 意思就是先走离线命令词识别,如果离线命令词识别没有识别到结果,那么就再走语义接口,如果已开通对应场景,则转为语义,如果没有开通对应场景,则将语音转为文字 效果图 说的 ...

  8. 哈工大视听觉信号处理——听觉部分报告——一种智能家居命令词识别系统的设计

    题     目 听觉部分 专       业 软件工程 学    号 120L0219XX 班    级 2037101 姓       名 李启明 报 告 日 期 2022.12.20 一.基频 ( ...

  9. DTW 算法的实时语音识别——命令词识别(Python 实现)

    介绍 这是我们计算机视听觉的第三个实验,也是本学期语音部分的最后一个实验,大概花了两天才写完.上个实验做的是语音编码问题,这个实验是语音识别的事,感觉处理语音还是比较有意思的. 附上实验代码地址:实验 ...

最新文章

  1. ajax提交相对路径报错,ajax提交请求为啥url要用这个函数encodeURI
  2. axis调用webservice客户端开发
  3. 4028: [HEOI2015]公约数数列
  4. sqlyong 删除数据能否撤回_数据结构知识点总结
  5. CodeCraft-21 and Codeforces Round #711 (Div. 2)
  6. 在正式使用计算机账务系统的银行对账功能,用友ERP-U8管理系统认证考试理论题...
  7. 从 Elasticsearch 来看分布式系统架构设计
  8. java kafka client_Kafka Client API 基本使用
  9. SQL 使用总结五(杂记)
  10. WannaCry病毒阴魂不散:本田一家工厂受影响停产一天
  11. 前端简单h5播放器的制作
  12. js读取json文件(原生和jQuery)
  13. 【随笔篇】2019全国大学生电子设计竞赛回望与总结
  14. 【福利】邀请博主,赢取大奖
  15. 社工攻击@斯拉夫字母
  16. 西北乱跑娃 --- requests爬虫五大反反爬机制
  17. 看完全都会了!阿里巴巴java开发工程师待遇
  18. cygwin 安装 swoole
  19. 车载开发之CarLife CarPlay HiCar
  20. signature=cb82c091db06fa79a186fd76d144c804,Signature splitting and magnetic rotation in 86Y

热门文章

  1. 微信小程序 canvas 卡顿 闪退
  2. 最后100天考研复习计划
  3. LabVIEW编程LabVIEW开发如何沟通需求
  4. 快手直播电商的未来想象
  5. 【转载】C#中AddRange方法往ArrayList集合末尾添加另一个集合
  6. 恢复未保存word文档
  7. 【题解】AcWing 第73场周赛题解
  8. 《C语言程序设计实践》————如何买玫瑰?(贪心思维)
  9. 帝国CMS仿新版知更鸟自适应源码支持黑夜模式
  10. 聚合收款收银收款多商户门店系统开发