CMUS狮身人面像(四)-构建语言模型

构建语言模型

语言模型是配置的重要组成部分,它告诉解码器可以识别哪些单词序列。

模型有多种类型:关键词列表、语法和统计语言模型以及语音语言模型。它们具有不同的功能和性能特性。您可以根据需要选择任何解码模式,甚至可以在运行时在模式之间切换。有关更多详细信息,请参阅Pocketsphinx 教程。

关键词列表

Pocketsphinx 支持关键字发现模式,您可以在其中指定要查找的关键字列表。这种模式的优点是可以为每个关键词指定一个阈值,这样就可以在连续语音中检测到关键词。所有其他模式都会尝试从语法中检测单词,即使您使用的单词不在语法中。典型的关键字列表如下所示:

oh mighty computer /1e-40/
hello world /1e-30/
other phrase /1e-20/

必须为每个关键短语指定阈值。对于较短的关键短语,您可以使用较小的阈值,例如1e-1,对于较长的关键短语,阈值必须更大,最大为1e-50。如果您的关键短语非常长(超过 10 个音节),建议将其拆分并分别查找各个部分。必须调整阈值以在误报和漏检之间取得平衡。最好的方法是使用预先录制的音频文件。常见的调优流程如下:

  1. 录制一段较长的录音,其中很少出现您的关键字和其他一些声音。您可以拍摄电影声音或其他东西。音频长度应约为 1 小时。
  2. 使用以下命令对该文件运行关键字识别,每个关键字具有不同的阈值:
     pocketsphinx_continuous -infile <your_file.wav> -keyphrase <your keyphrase> \
      -kws_threshold <your_threshold> -time yes

    该命令将打印许多行,其中一些是带有检测时间和置信度的关键字。您还可以使用-logfn your_file.log选项禁用额外日志以避免混乱。

  3. 根据您的关键字识别结果,计算您遇到的误报和漏检次数。
  4. 选择误报和漏检最少的阈值。

为了获得最佳准确性,最好使用 3-4 个音节的关键词。太短的短语很容易混淆。

仅pocketsphinx 支持关键字列表,sphinx4 无法处理它们。

将关键字列表与 PocketSphinx 结合使用

要在命令行中使用关键字列表,请使用-kws选项指定它。您还可以使用-keyphrase选项来指定单个关键短语。

在 Python 中,您可以在配置对象中指定选项,也可以添加关键字的命名搜索:

decoder.set_kws('keyphrase', kws_file)
decoder.set_search('keyphrase')

在 Android 中,它看起来类似:

recognizer.setKws('keyphrase', kwsFile);
recognizer.startListening('keyphrase')

请注意-kws-lm-jsgf选项冲突。您不能同时指定两者。

语法

语法描述了一种非常简单的命令和控制语言类型。它们通常是手工编写的或在代码中自动生成的。语法通常没有单词序列的概率,但某些元素可能会被加权。它们可以使用 Java 语音语法格式 ( JSGF ) 创建,并且通常具有.gram.jsgf等文件扩展名。

语法允许您非常精确地指定可能的输入,例如,某个单词可能只重复两到三次。但是,如果您的用户不小心跳过了语法所需的单词,这种严格性可能会有害。那样的话整个识别就会失败。因此,最好使语法更加灵活。只需列出允许任意顺序的词袋,而不是短语。避免具有许多规则和情况的非常复杂的语法。它只会减慢识别器的速度,您可以使用简单的规则来代替。过去,语法需要花费大量的精力来调整它们,正确地分配变体等等。大型 VXML 咨询行业就是这样的。

建立语法

语法通常以 Java 语音语法格式 (JSGF) 手动编写:

#JSGF V1.0;

grammar hello;
public <greet> = (good morning | hello) ( bhiksha | evandro | rita | will );

有关 JSGF 的更多信息,请参阅 W3C 上的完整文档。

在 PocketSphinx 中使用语法

要在命令行中使用您的语法,请使用选项指定它-jsgf

在 Python 中,您可以在配置对象中指定选项,也可以添加语法的命名搜索:

decoder.set_jsgf('grammar', jsgf_file)
decoder.set_search('grammar')

在 Android 中,这看起来很相似:

recognizer.setJsgf('grammar', jsgfFile);
recognizer.startListening('grammar')

请注意-jsgf-kws-jsgf选项冲突。您不能同时指定两者。

语言模型

统计语言模型描述更复杂的语言。它们包含单词和单词组合的概率。这些概率是根据样本数据估计的,并且自动具有一定的灵活性。词汇表中的每种组合都是可能的,尽管每种组合的概率会有所不同。例如,如果您从单词列表创建统计语言模型,它仍然允许解码单词组合,即使这可能不是您的意图。

总体而言,建议将统计语言模型用于自由格式输入,用户可以用自然语言说出任何内容。它们需要比语法更少的工程工作。您只需列出可能的句子即可。例如,您可能会列出“二十一”和“三十三”之类的数字,统计语言模型也会以一定的概率允许“三十一”。

一般来说,现代语音识别界面往往更加自然,并避免了上一代的命令和控制风格。因此,大多数界面设计人员更喜欢使用统计语言模型进行自然语言识别,而不是使用老式的 VXML 语法。

关于设计 VUI 界面的主题,您可能会对以下书籍感兴趣: Bruce Balentine 所著的《It is Better to Be a Good Machine Than a Bad Person: Speech Recognition and Other Exotic User Interfaces at the Twilight of the Jetsonian Age》 。

构建统计语言模型的方法有很多。当您的数据集很大时,使用 CMU 语言建模工具包是有意义的。当模型较小时,您可以使用快速在线 Web 服务。当您需要特定选项或者您只想使用您最喜欢的工具包来构建 ARPA 模型时,您也可以使用它。

语言模型可以以三种不同的格式存储和加载:文本 ARPA格式、二进制BIN格式和二进制DMP格式。ARPA 格式占用更多空间,但可以对其进行编辑。ARPA 文件有一个.lm扩展名。二进制格式占用的空间显着减少,加载速度更快。二进制文件有一个.lm.bin扩展名。也可以在这些格式之间进行转换。DMP 格式已过时,不推荐。

构建统计语言模型

文本准备

首先,您需要准备大量干净的文本。扩展缩写、将数字转换为单词、清理非单词项目。例如,要清理 Wikipedia XML 转储,您可以使用特殊的 Python 脚本,例如Wikiextractor。要清理 HTML 页面,您可以尝试 BoilerPipe。这是一个专门为从 HTML 中提取文本而创建的很好的包。

有关如何从维基百科文本创建语言模型的示例,请参阅此博客文章。电影字幕也是口语的良好来源。

完成语言建模过程后,请将您的语言模型提交到 CMUSphinx 项目。我们很乐意分享!

普通话和其他类似语言的语言建模与英语基本相同,但还有一项额外的考虑。不同之处在于输入文本必须进行分词。提供了分段工具和关联的单词列表来实现此目的。

使用 SRILM 训练 ARPA 模型

使用 SRI 语言建模工具包 ( SRILM )训练模型非常简单。这就是我们推荐它的原因。此外,SRILM 是迄今为止最先进的工具包。要训​​练模型,您可以使用以下命令:

ngram-count -kndiscount -interpolate -text train-text.txt -lm your.lm

您可以事后修剪模型以减小模型的大小:

ngram -lm your.lm -prune 1e-8 -write-lm your-pruned.lm

训练完成后,值得在测试数据上测试模型的困惑度:

ngram -lm your.lm -ppl test-text.txt

使用 CMUCLMTK 训练 ARPA 模型

您需要下载并安装 CMUSphinx 的语言模型工具包(CMUCLMTK)。详情请参阅下载页面。

创建语言模型的过程如下:

1) 准备用于生成语言模型的参考文本。语言模型工具包期望其输入采用规范化文本文件的形式,话语由<s></s> 标签分隔。许多输入过滤器可用于特定语料库,例如 Switchboard、ISL 和 NIST 会议以及 HUB5 转录本。结果应该是由句子的开始和结束标记界定的句子集:<s></s>。这是一个例子:

<s> generally cloudy today with scattered outbreaks of rain and drizzle
persistent and heavy at times </s>
<s> some dry intervals also with hazy sunshine especially in eastern parts in
the morning </s>
<s> highest temperatures nine to thirteen Celsius in a light or moderate mainly
east south east breeze </s>
<s> cloudy damp and misty today with spells of rain and drizzle in most places
much of this rain will be light and patchy but heavier rain may develop in the
west later </s>

更多的数据将产生更好的语言模型。weather.txtsphinx4(用于生成天气语言模型)的文件包含近 100,000 个句子。

2)生成词汇文件。这是文件中所有单词的列表:

 text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab

3) 您可能需要编辑词汇文件以删除单词(数字、拼写错误、名称)。如果您发现拼写错误,最好在输入记录中修复它们。

4) 如果您想要一个封闭词汇语言模型(一种没有针对未知单词的规定的语言模型),那么您应该从输入记录中删除包含词汇文件中不存在的单词的句子。

5) 使用以下命令生成 ARPA 格式语言模型:

 text2idngram -vocab weather.vocab -idngram weather.idngram < weather.closed.txt
  idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.vocab -arpa weather.lm

6)生成CMU二进制形式(BIN):

sphinx_lm_convert -i weather.lm -o weather.lm.bin

使用 Web 服务构建简单的语言模型

如果您的语言是英语并且文本很小,有时使用 Web 服务来构建它会更方便。以这种方式构建的语言模型对于简单的命令和控制任务来说非常实用。首先,您需要创建一个语料库。

“语料库”只是一个用于训练语言模型的句子列表。作为一个例子,我们将使用一个假设的移动互联网设备语音控制任务。我们想告诉它“打开浏览器”、“新电子邮件”、“前进”、“后退”、“下一个窗口”、“最后一个窗口”、“打开音乐播放器”等信息。因此,我们首先创建一个名为的文件corpus.txt

open browser
new e-mail
forward
backward
next window
last window
open music player

然后进入LMTool页面。只需单击“浏览...”按钮,选择corpus.txt您创建的文件,然后单击“编译知识库”

您应该看到一个包含一些状态消息的页面,后面是一个标题为“Sphinx 知识库”的页面。该页面将包含标题为“词典”“语言模型”的链接。下载这些文件并记下它们的名称(它们应包含 4 位数字,后跟扩展名 .dic.lm)。您现在可以使用 PocketSphinx 测试新创建的语言模型。

使用其他语言模型工具包

有许多工具包可以从文本文件创建 ARPA n-gram 语言模型。

您可以尝试一些工具包:

  • 肯·LM
  • IRSTLM
  • 麻省理工学院

如果您正在训练大词汇量语音识别系统,则语言模型训练将在有关大规模语言模型的单独页面中概述。

创建 ARPA 文件后,您可以将模型转换为二进制格式以加快加载速度。

将模型转换为二进制格式

要快速加载大型模型,您可能希望将它们转换为二进制格式,以节省解码器初始化时间。对于小模型来说这是没有必要的。Pocketsphinx 和 sphinx3 都可以使用该选项来处理它们-lm。Sphinx4 通过 lm 文件的扩展名自动检测格式。

ARPA 格式和 BINARY 格式可以相互转换。sphinx_lm_convert您可以使用sphinxbase 中的命令生成另一个文件:

sphinx_lm_convert -i model.lm -o model.lm.bin
sphinx_lm_convert -i model.lm.bin -ifmt bin -o model.lm -ofmt arpa

您还可以通过这种方式将旧的 DMP 模型转换为二进制格式。

在下一节中,我们将讨论如何使用、测试和改进您创建的语言模型。

将您的语言模型与 PocketSphinx 结合使用

如果您已经安装了 PocketSphinx,您将有一个名为 的程序 pocketsphinx_continuous,可以从命令行运行该程序来识别语音。假设它安装在 下 /usr/local,并且您的语言模型和字典被调用8521.dic8521.lm放置在当前文件夹中,请尝试运行以下命令:

pocketsphinx_continuous -inmic yes -lm 8521.lm -dict 8521.dic

这将使用您的新语言模型、词典和默认声学模型。在 Windows 上,您还必须使用以下选项指定声学模型文件夹-hmm

bin/Release/pocketsphinx_continuous.exe -inmic yes -lm 8521.lm -dict 8521.dic -hmm model/en-us/en-us

您将看到很多诊断消息,然后暂停,然后输出 “READY…”。现在您可以尝试说出一些命令。它应该能够完全准确地识别它们。如果没有,您的麦克风或声卡可能有问题。

将您的语言模型与 Sphinx4 结合使用

在 Sphinx4 高级 API 中,您需要在配置中指定语言模型的位置:

configuration.setLanguageModelPath("file:8754.lm");

如果模型在资源中,您可以通过以下方式引用它"resource:URL"

configuration.setLanguageModelPath("resource:/com/example/8754.lm");

另请参阅Sphinx4 教程以了解更多详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/582064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全栈从0到1 3D旅游地图标记和轨迹生成

功能演示 演示视频 体验地址 Vercel App 开发技术栈&#xff1a; NextJs&#xff08;前端框架&#xff09;React&#xff08;前端框架&#xff09;TailwindCSS &#xff08;CSS样式&#xff09;echart echart gl &#xff08;地图生成&#xff09;shadui&#xff08;UI组件…

HTML5本地存储账号密码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML5本地存储账号密码</title> </head…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索&#xff0c;通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

Android 学习 鸿蒙HarmonyOS 4.0 第二天(项目结构认识)

项目结构认识 和 了解&#xff1a; 工程目录下的结构如下&#xff1a; 首先能看到有两个.开头的文件&#xff0c;分别是.hvigor 和 .idea。这两个文件夹都是与构建有关系的&#xff0c; 如果你开发过安卓app&#xff0c;构建完会生成一个apk安装包&#xff0c;鸿蒙则是生成hap…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

急急急!微信朋友圈删除了怎么恢复?

微信朋友圈是我们与朋友分享生活点滴的重要平台&#xff0c;但有时候微信出现异常&#xff0c;导致我们编辑好的朋友圈被删除了&#xff0c;这时候该怎么办呢&#xff1f; 幸运的是&#xff0c;微信提供了一种简单的方式来恢复已删除的朋友圈内容。微信朋友圈删除了怎么恢复&a…

react 学习笔记二:ref、状态、继承

基础知识 1、ref 创建变量时&#xff0c;需要运用到username React.createRef()&#xff0c;并将其绑定到对应的节点。在使用时需要获取当前的节点&#xff1b; 注意&#xff1a;vue直接使用里面的值&#xff0c;不需要再用this。 2、状态 组件描述某种显示情况的数据&#…

tkinter中是否有必要使用类

1. 问题背景 在使用tkinter编写事件驱动程序时&#xff0c;Fredrik Lundh的教程中提到&#xff0c;创建一个类&#xff08;App&#xff09;作为框架&#xff0c;并以类的实例运行程序&#xff0c;这样会更好&#xff0c;而不是直接启动程序。 以下是问题&#xff1a; 在tkin…

【Go语言快速上手(五)】文件操作协程操作

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. GO语言的文件操…

武汉星起航:挂牌上海股权中心,开启资本新篇章助力跨境电商飞跃

2023年10月30日&#xff0c;武汉星起航电子商务有限公司在上海股权托管交易中心成功挂牌展示&#xff0c;标志着这家在跨境电商领域拥有卓越声誉的企业正式迈入了资本市场的大门。对于武汉星起航来说&#xff0c;这不仅是其发展历程中的一个重要里程碑&#xff0c;更是对其业务…

Python学习笔记------异常

当检测到错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现一些错误提示&#xff0c;就是所谓异常&#xff08;bug&#xff09; 1、异常的捕获方法 任何程序运行过程中都可能出现异常&#xff0c;我们可以在力所能及的范围内&#xff0c;对可能出现的bug提…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

ip网络广播前置放大器SV-7031 接纯后级功放

ip网络广播前置放大器SV-7031 接纯后级功放 感谢您使用我们的网络前置放大器SV-7031。 SV-7031具有1路AC200V OUT电源输出&#xff0c;1路AC200V IN电源输入&#xff1b;RJ45 网络接口&#xff0c;具有网络音频广播、本地广播功能。 18123651365 ip网络广播前置放大器SV-703…

vue-cli+vue3+vite+ts 搭建uniapp项目全过程(一)

unapp官方提供了cli 脚手架创建 uni-app 项目的文档 Vue3/Vite版要求 node 版本 18、20使用Vue3/Vite版创建不会提示选择模板&#xff0c;目前只支持创建默认模板 本文以vue3vitets为例 1、初始化项目 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 执行完生成…

就业班 第三阶段(tomcat) 2401--4.28 day1 tomcat1安装配置及单机多实例

企业 Tomcat 运维 文章目录 企业 Tomcat 运维一、Tomcat 简介1、Tomcat好帮手---JDK2、安装Tomcat & JDK1、系统环境说明2 、安装JDK3、安装Tomcat 二、Tomcat目录介绍1、tomcat主目录介绍2、webapps目录介绍3、Tomcat配置介绍&#xff08;conf&#xff09;4、Tomcat的管理…

Linux-管道通信

1. 管道概念 管道&#xff0c;是进程间通信的一种方式&#xff0c;在Linux命令中“ | ”就是一种管道&#xff0c;它可以&#xff0c;连接前一条命令&#xff0c;和后一条命令&#xff0c;把前面命令处理完的内容交给后面&#xff0c;例如 cat filename | grep hello …

本地部署 Meta Llama3-8b

Meta Llama 3(8B) Instruct model performance Meta Llama 3(8B) Pre-trained model performance 使用 Ollama 运行 Llama3 访问 Tags llama3&#xff0c;选择你想运行的模型&#xff0c;例如&#xff0c;8b-instruct-q8_0 拷贝并运行命令&#xff0c;ollama run llama3:8b-…

秋招后端开发面试题 - Java语言基础(上)

目录 Java基础上前言面试题Java 语言的特点JVM JDK JRE什么是跨平台性&#xff1f;原理是什么&#xff1f;什么是字节码?采用字节码的好处是什么?Java 和 C 的区别&#xff1f;注释&#xff1f;关键字关键字 instanceof类型转换关键字 this 和 super关键字 final finally fin…

Android数据恢复:如何在手机上恢复丢失的文件和照片

我们都有 我们错误地从手机中删除重要内容的时刻。确实如此 不一定是我们的错。其他人可以对您的手机数据执行此操作 有意或无意。这在某个时间点发生在我们所有人身上。 但是&#xff0c;今天市场上有各种各样的软件可以 帮助恢复已删除的文件。这些类型的软件被归类为数据恢复…

Linux命令大全 以及搭建hadoop

Liunx系统目录 ├── bin -> usr/bin # 用于存放二进制命令 ├── boot # 内核及引导系统程序所在的目录 ├── dev # 所有设备文件的目录&#xff08;如磁盘、光驱等&#xff09; ├── etc # 配置文件默认路径、服务启动命令存放目录 ├── home # 用户家目录&#…
最新文章