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.txtidngram2lm -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.mzph.cn/news/830172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pixelmator Pro for Mac:简洁而强大的图像编辑软件

Pixelmator Pro for Mac是一款专为Mac用户设计的图像编辑软件&#xff0c;它集简洁的操作界面与强大的功能于一身&#xff0c;为用户提供了卓越的图像编辑体验。 Pixelmator Pro for Mac v3.5.9中文激活版下载 该软件支持多种文件格式&#xff0c;包括常见的JPEG、PNG、TIFF等&…

系统触发器

目录 数据库触发器 常见触发器&#xff0c;记录登录和退出数据库事件 模式触发器 创建一个模式触发器&#xff0c;记录各种 DDL 操作的日志 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 前面已经介绍过&#xff0c;…

WEB攻防-PHP特性-函数缺陷对比

目录 和 MD5函数 intval ​strpos in_array preg_match str_replace 和 使用 时&#xff0c;如果两个比较的操作数类型不同&#xff0c;PHP 会尝试将它们转换为相同的类型&#xff0c;然后再进行比较。 使用 进行比较时&#xff0c;不仅比较值&#xff0c;还比较变量…

MATLAB非均匀网格梯度计算

在matlab中&#xff0c;gradient函数可以很方便的对均匀网格进行梯度计算&#xff0c;但是对于非均匀网格&#xff0c;但是gradient却无法求解非均匀网格的梯度&#xff0c;这一点我之前犯过错误。我之前以为在gradient函数中指定x&#xff0c;y等坐标&#xff0c;其求解的就是…

Metasploit 溢出 samba 提权漏洞

一、信息收集 1.1 右键单击桌面&#xff0c;选择 Open Terminal Here &#xff0c;打开终端。 1.2 输入命令 nmap -sS -p 139,445 -A 192.168.1.254 ,对目标主机进行扫描,发现 139、445 端口开放。 1.3 输入命令“msfconsole”&#xff0c;启动 MSF 终端。 1.4 输入命令“searc…

电脑录制视频快捷键,一键开启录屏新时代(干货)

“最近尝试录制一些电脑上的操作视频&#xff0c;用来制作教学教程。不过&#xff0c;每次录制都要通过菜单或搜索来打开录屏软件&#xff0c;实在是有些繁琐。有没有人知道哪些电脑录制视频的快捷键呀&#xff1f;或者有没有通用的快捷键设置方法&#xff1f;” 在当今数字时…

免费语音转文字:自建Whisper,贝锐花生壳3步远程访问

Whisper是OpenAI开发的自动语音识别系统&#xff08;语音转文字&#xff09;。 OpenAI称其英文语音辨识能力已达到人类水准&#xff0c;且支持其它98中语言的自动语音辨识&#xff0c;Whisper神经网络模型被训练来运行语音辨识与翻译任务。 此外&#xff0c;与其他需要联网运行…

MySQL中脏读与幻读

一般对于我们的业务系统去访问数据库而言&#xff0c;它往往是多个线程并发执行多个事务的&#xff0c;对于数据库而言&#xff0c;它会有多个事务同时执行&#xff0c;可能这多个事务还会同时更新和查询同一条数据&#xff0c;所以这里会有一些问题需要数据库来解决 我们来看…

centos 7使用源码编译安装Python 3.12.2(最新版本)

&#xff08;一&#xff09;、说明 在centos 7上&#xff0c;默认安装出来的python是&#xff1a;2.7.5版本 1.查看python版本&#xff1a; python --version 2.通过yum安装出来的&#xff0c;适合当前操作系统的&#xff0c;最新的python版本是&#xff1a;3.6.8 python3…

云手机对出海企业有什么帮助?

近些年&#xff0c;越来越多的企业开始向海外拓展&#xff0c;意图发掘更广阔的市场。在这过程中&#xff0c;云手机作为一个新型工具为很多企业提供了助力&#xff0c;尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先&#xff0c;云手机的出现解决了企业在海外拓…

【Linux系统化学习】死锁 | 线程同步

目录 死锁 死锁的必要条件 避免死锁 线程同步 条件变量 同步概念和竞态条件 条件变量接口 创建和初始化条件变量 等待条件满足 唤醒等待 毁条件变量 为什么 pthread_cond_wait 需要互斥量? 条件变量使用规范 等待条件代码 给条件发送信号代码 死锁 死锁是指在一…

扭蛋机小程序带来了什么优势?扭蛋机收益攻略

在当下的潮流消费时代&#xff0c;人们对潮玩也日益个性化&#xff0c;扭蛋机作为一种新型的娱乐消费模式&#xff0c;深受大众喜爱。扭蛋机的价格低&#xff0c;各个年龄层的玩家都可以进行购买&#xff0c;潜在玩家量非常大。扭蛋机商品主打热门IP周边等&#xff0c;种类繁多…

【PostgreSQL】Postgres数据库安装、配置、使用DBLink详解

目录 一、技术背景1.1 背景1.2 什么是 DBLink 二、安装配置 DBLink2.1 安装 DBLink2.2 配置 DBLink1. 修改 postgresql.conf2. 修改 pg_hba.conf 三、DBLink 使用3.1 数据准备3.2 DBLink 使用1. 创建 DBLink 连接2. 使用 DBLink 进行查询3. 使用 DBLink 进行增删改4. 使用 DBLi…

python代码实现kmeans对鸢尾花聚类

导入第三方库和模型 from sklearn import datasets import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans2、创建画图函数 def draw_result(train_x, labels, cents, title):n_clusters np.unique(labels).shape[0]#获取类别个数color …

用vue3实现留言板功能

效果图&#xff1a; 代码&#xff1a; <script setup lang"ts"> import { ref } from vue;interface Message {name: string;phone: string;message: string; }const name ref<string>(); const phone ref<string>(); const message ref<st…

Llama 3 安装使用方法

Llama3简介&#xff1a; llama3是一种自回归语言模型&#xff0c;采用了transformer架构&#xff0c;目前开源了8b和70b参数的预训练和指令微调模型&#xff0c;400b正在训练中&#xff0c;性能非常强悍&#xff0c;并且在15万亿个标记的公开数据进行了预训练&#xff0c;比ll…

python——井字棋游戏——登入注册界面

本篇文章只讲解登入和注册页面&#xff0c;在后面的文章中会讲解井字棋游戏&#xff0c;然后把井字棋和登入界面进行连接&#xff0c;整合成一个完整的游戏。 登入注册界面在本篇文章的末尾。 1.实现登入界面 &#xff08;1&#xff09;导入图片 把这张图片存储在与代码路径…

Rundeck(四)安全配置

自动化运维工具rundeck GitHub - rundeck 是java开发的开源自动化服务&#xff0c;具有 Web 控制台、命令行工具和 WebAPI。它使您可以轻松地跨一组节点运行自动化任务&#xff0c;适合运维自动化管理、自动发布管理、运维数据分析等 网站&#xff1a;https://www.rundeck.co…

人人开源框架运行

Getting started renrenio/renren-fast-vue Wiki GitHub 人人开源 1.启动navicat&#xff1a;新建一个数据库renren-fast&#xff0c;字符集为utf-8,utf-8mb3或者utf-8mb4&#xff0c;排序规则不选 2.数据库操作在renren-fast数据库中选择表&#xff0c;运行renren-fast-ma…

LeetCode 每日一题 ---- 【1017.负二进制转换】

LeetCode 每日一题 ---- 【1017.负二进制转换】 1017.负二进制转换方法一&#xff1a;模拟进制转换推广&#xff1a;任意进制转换 1017.负二进制转换 方法一&#xff1a;模拟进制转换 我们平常做进制转换最常用的方法就是辗转相除法&#xff0c;下面的图示分别给出了普通的10…