(以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码)

定制化语音识别

1. 背景

在一些特定场景下,要求ASR系统对某些固定句式的关键词准确识别。

  1. 打车报销单场景,要求日期,时间,地点,金额精准识别。
  2. 定制化的唤醒词以及命令词,如在车机放音乐场景,那么只需要高精度的识别下一首,上一首,音量调大,音量调小等命令词。
  3. 还有语音助手打电话的场景,需要根据用户通讯录,完成联系人的识别等等。

为满足此种需求,本文展示一种定制化识别的方案。
第二节介绍相关的基础知识。
第三节已一个 Demo 展示如何实际操作。

PaddleSpeech SpeechX 已上线更详细的操作脚本和教程,欢迎大家关注。


来自电影《钢铁侠》

2. WFST 解码器相关概念:

2.1 WFST 介绍

WFST是加权有限状态机(weighted finite-state transducers)的简称【2】。在语音识别中,基于 WFST 生成的解码图,配合声学模型进行 viterbi 解码是语音识别中一种基础的解码方法。
这种有限状态机有一个有限的状态集合以及状态之间的跳转,其中每个跳转至少有一个标签。
如果存在一条从初始状态到终止状态的路径,使得路径上的标签序列正好等于输入符号序列,那么则输出一个新的序列和权值。

如下图WFST,输入’ac’串,匹配到0-1,1-2这个路径,输出’qs’, 权重1.63。

OpenFST【1】实现了 WFST【2】的相关算法,后续的算法解释以及解码图的构建与操作,都是基于 OpenFST 来完成。
相关 OpenFST 以及 WFST 的介绍可以参考如下链接:
openfst官方教程

2.2 WFST Compose 概念

下图中WFST C是有WFST A,B Compose而成,可以看做为A,B的级联,A的输出是B的输出,所以组成C后,C的输入为A的输入,B的输出为C的输出。

2.3 WFST Decoder TLG 解码图

PaddleSpeech SpeechX 中 WFST 的解码图是由T,L,G构成,用于kaldi中的解码图是由HCLG构成。下面以TLG为例说明解码构图。

缩写 名称 输入序列 输出序列
T Token 建模单元
L Lexicon
G Grammar

其中 T 可以是音素,也可以是字符,PaddleSpeech Speechx中建模使用的是字符。 下面以提出TLG的论文【3】中的实例来说明构图。

  • T 是以音素来构图的,IH 为【3】中声学模型神经网络的建模单元英文音素。下图就是 ‘is’ 中 /i/ 的发音表示。

T 的构图
  • L 是发音词典,下图为‘is’的发音/iz/的表示。

L 的构图
  • 论文【3】中简单的语言模型的构图如下。用于识别how are you,how is it。

G 的构图

通过TLG的Compose,把声学建模单元,词典,语言模型糅合在一起,产生一个静态的解码网络。在解码过程中采用搜索策略,得到输入语音的最优解码结果。

2.4 WFST Replace 概念

  • 下图是带slot的G,表示的识别语句是打车到xxx。

  • 下图为地址的Slot WFST,可以定制添加所需识别的地点。

  • 下图为slot WFST替换到G中的address slot后的WFST(使用 fstreplace 操作)。

画图以及操作脚本见 draw_address_g_slot.sh 可以在终端中执行。(需要安装dot,画出图保存为pdf.)

Openfst replace操作 官方教程

3 打车报销单场景介绍

本节会通过定制地点来说明操作。打车报销单识别场景,一个需要定制化识别的是地点,精细化的地点识别,如在北京,可导入北京的地点包,在上海,可导入上海的地点包,以此来满足一些精细化识别(稀有特有地名)。脚本中会以对”海淀黄庄“的识别来简单示例。

3.1 脚本代码解析

  • 编译出一个带slot的G:
cat > $lang/g_with_slot.txt <<EOF
0 1 打 打
1 2 车 车
2 3 到 到
3 4 <ADDRESS_SLOT> <ADDRESS_SLOT>
4
EOF
fstcompile --isymbols=$lang/words.txt --osymbols=$lang/words.txt \$lang/g_with_slot.txt $lang/g_with_slot.fst
  • 编译出address slot的fst:
cat > $lang/address_slot.txt <<EOF
0 1 机场 机场
0 1 家 家
0 1 地铁站 地铁站
0 2 苏州 苏州
2 1 街 街
1
EOFfstcompile --isymbols=$lang/words.txt --osymbols=$lang/words.txt \$lang/address_slot.txt $lang/address_slot.fst
  • 替换掉G中的address slot。
fstreplace --epsilon_on_replace $lang/g_with_slot.fst $root_label \$lang/address_slot.fst  $address_slot_label $lang/g.fst
  • compose T,L,G为TLG成最终的解码图。
fsttablecompose $lang/L.fst $lang/g.fst | fstdeterminizestar --use-log=true | \fstminimizeencoded | fstarcsort --sort_type=ilabel > $lang/lg.fst || exit 1;fsttablecompose $lang/T.fst $lang/lg.fst > $lang/tlg.fst || exit 1;

3.2 操作

3.2.1 构图,测试识别

打开终端,执行以下命令:

!test -f model.tar.gz || (wget -nc https://paddlespeech.bj.bcebos.com/s2t/paddle_asr_online/model.tar.gz  && tar xzvf model.tar.gz)
!test -d model || tar xzvf model.tar.gz
!test -f resource.tar.gz || wget -nc https://paddlespeech.bj.bcebos.com/s2t/paddle_asr_online/resource.tar.gz
!test -d resource || tar xzvf resource.tar.gz
! mv resource/* .
!cd ./resource
!bash ./mk_graph.sh
!ls ./graph
!ls ./graph/tlg.fst
# 测试生成解码图:
!bash ./demo_test.sh

会从log中发现:如下识别结果

rec_ais1  打车到家
rec_ais2  打车到机场
rec_ais3  打车到苏州街

所以从wave/class_demo.trans可以看出第一句话识别错误。把’海淀黄庄’识别成了’家’。

3.2.1 修改address slot,构图,测试识别

修改 mk_graph.sh 中 address_slot 部分为:

cat > $lang/address_slot.txt <<EOF
0 1 机场 机场
0 1 海淀黄庄 海淀黄庄
0 1 家 家
0 1 地铁站 地铁站
0 2 苏州 苏州
2 1 街 街
1
EOF

见脚本 mk_graph2.sh

!bash ./mk_graph2.sh
!ls ./graph/tlg.fst
#然后测试:
!bash ./demo_test.sh

可以发现正确识别了。

rec_ais1  打车到海淀黄庄
rec_ais2  打车到机场
rec_ais3  打车到苏州街

具体脚本已经上传到github speechx的example,可以参见:https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/speechx/examples/custom_asr

4 Reference

【1】https://www.openfst.org/twiki/bin/view/FST/FstQuickTour
【2】Mohri M, Pereira F, Riley M. Speech recognition with weighted finite-state transducers[M]//Springer Handbook of Speech Processing. Springer, Berlin, Heidelberg, 2008: 559-584.
【3】Miao Y, Gowayyed M, Metze F. EESEN: End-to-end speech recognition using deep RNN models and WFST-based decoding[C]//2015 IEEE Workshop on Automatic Speech Recognition and Understanding (ASRU). IEEE, 2015: 167-174.

P.S. 欢迎关注我们的 github repo PaddleSpeech, 是基于飞桨 PaddlePaddle 的语音方向的开源模型库,用于语音和音频中的各种关键任务的开发,包含大量基于深度学习前沿和有影响力的模型。

【飞桨PaddleSpeech语音技术课程】— 语音识别-定制化识别相关推荐

  1. 【飞桨PaddleSpeech语音技术课程】— 语音识别-Deepspeech2

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) 语音识别--DeepSpeech2 0. 视频理解与字幕 # 下载demo视频 !test -f work/sour ...

  2. 【飞桨PaddleSpeech语音技术课程】— 语音唤醒

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) 1. KWS 概述 随着人工智能的飞速发展,市场上推出了各式各样的智能设备,AI 语音的发展更是使得语音助手成为各大 ...

  3. 【飞桨PaddleSpeech语音技术课程】— 一句话语音合成全流程实践

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) 一句话语音合成全流程实践 点击播放视频 1 声音克隆介绍 & 语音合成基本概念回顾 语音合成(Speech ...

  4. 【飞桨PaddleSpeech语音技术课程】— 声音分类

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) 1. 识别声音 通过声音,人的大脑会获取到大量的信息,其中的一个场景是:识别和归类.如:识别熟悉的亲人或朋友的声音. ...

  5. 【飞桨PaddleSpeech语音技术课程】— 流式语音合成技术揭秘与实践

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) PP-TTS:流式语音合成原理及服务部署 1 流式语音合成服务的场景与产业应用 语音合成(Speech Sysnth ...

  6. 【飞桨PaddleSpeech语音技术课程】— 语音翻译

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) End-to-End Speech (to Text) Translation 前言 背景知识 语音翻译(ST, S ...

  7. 【飞桨PaddleSpeech语音技术课程】— 语音合成

    (以下内容搬运自飞桨PaddleSpeech语音技术课程,点击链接可直接运行源码) 『听』和『说』 人类通过听觉获取的信息大约占所有感知信息的 20% ~ 30%.声音存储了丰富的语义以及时序信息,由 ...

  8. 《飞桨PaddleSpeech语音技术课程》一句话语音合成全流程实践

    一句话语音合成全流程实践 PaddleSpeech r1.2.0 发新内容 1 声音克隆介绍 & 语音合成基本概念回顾 语音合成(Speech Sysnthesis),又称文本转语音(Text ...

  9. 【飞桨PaddleSpeech语音技术课程】— 语音识别-Transformer

    使用 Transformer 进行语音识别 0. 视频理解与字幕 # 下载demo视频 !test -f work/source/subtitle_demo1.mp4 || wget -c https ...

最新文章

  1. 快速排序 python菜鸟教程-1.6 快速排序
  2. 009_Vue循环结构
  3. linux下c语言tcp文件传输,C语言实现TCP通信
  4. Android 系统(230)---View 绘制流程 —— 基础(1)
  5. 不常用的SQL语句记录
  6. 企业工商信息数据API接口
  7. M1芯片安装CleanMyMac X4.7.4的方法(附下载)M1芯片安装那个CleanMyMac X版本?CleanMyMac X已完美支持M1芯片安装 支持big sur系统
  8. RMAN恢复Oracle数据库到不同的服务器
  9. slack 使用说明_使用Reacji自动将Slack消息移至其他渠道
  10. 短视频底层实操课,让你迅速从短视频新手变成高手
  11. zabbix用户和组权限、admin密码的修改
  12. 从2018年以太坊统计数据看区块链发展趋势
  13. Python基于Flask框架实现视频直播,电脑桌面录屏web端展示,远程控制电脑
  14. Anti-Roll Bar -- 防倾杆
  15. PHP 隐藏手机号,身份证号
  16. 傅里叶变换及其应用笔记(part 2)
  17. 为什么TCP存在重传
  18. 【樽海鞘算法】基于疯狂自适应的樽海鞘算法求解单目标优化问题附matlab代码
  19. ImportError: dlopen问题
  20. Zynq——PL_BRAM_PS数据传输

热门文章

  1. 安卓手机上批量合并b站视屏并重命名
  2. ELK搭建及基础使用(docker版)
  3. Linux如何查看某个端口状态
  4. unidbg 简介、基本使用、调用so中方法、unidbg-web
  5. C# 文字转语音遇到的坑(System.Speech)
  6. 激光切割机中的CO2、YAG、光纤三种激光切割器的比较
  7. 用科来解决一例佳能网络打印机无法添加的故障
  8. 华为荣耀3X 八大优势
  9. 育碧2k微软服务器,2K工作室更名-2K Games,育碧,全境封锁2 ——快科技(驱动之家旗下媒体)--科技改变未来...
  10. 在Linux上使用alias设置别名永久生效类似自定义命令