ubuntu下使用pocketsphinx进行语音识别

文章目录

  • 前言
  • 一、pocketsphinx的介绍
  • 二、ubuntu下编译
  • 三、使用示例
    • 1.模型选择
    • 2.代码示例
    • 3.自定义字典
  • 四、交叉编译
  • 总结


前言

由于工作需要语音识别的功能,环境是在linux arm版上,所以想先在ubuntu上跑起来看一看,就找了一下语音识别的开源框架,选中了很多框架可以看编译vosk那篇文章,现在一一试验一下。

网上对于pocketsphinx的介绍都比较老了,本篇博客将会在ubuntu上进行pocketsphinx编译使用,并且进行交叉编译。

|版本声明:山河君,未经博主允许,禁止转载


一、pocketsphinx的介绍

PocketSphinx是一款卡内基梅隆大学的开源大型词汇、独立于说话人的连续语音识别引擎。

对于接下来的编译使用,你需要知道:

  1. 它是一个离线语音识别系统
  2. 不再依赖SphinxBase ,所以对于网上文章出现调用cmd_ln_init这种接口的都是比较老的文章,某一天可能这篇博客也会变老
  3. pocketsphinx当前只有社区维护了,如果对于开源项目更新速度有要求的,不建议再使用它了。
  4. 有几个关键网址需要知道: pocketsphinx源码下载地址,通用模型下载地址,自定义模型库工具地址
  5. pocketsphinx支持自定义词典,针对关键词进行识别
  6. pocketsphinx依赖的模型库非常重要的文件:HMM:描述音频信号的模型,基于音素的发音特征;
  7. pocketsphinx依赖的模型库非常重要的文件: Dict:将单词映射到其音素发音的字典文件
  8. pocketsphinx依赖的模型库非常重要的文件: LM:描述单词序列概率的语言模型,帮助识别上下文关系

二、ubuntu下编译

sudo apt-get install build-essential cmake bison flex libpulse-dev python3-dev
git clone https://github.com/cmusphinx/pocketsphinx.git
cd pocketsphinx
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/install
make
make install

在安装路径下出现表示成功
在这里插入图片描述

  • bin:示例程序
  • build:中间文件,不用管
  • include:头文件
  • lib:静态库
  • share:里面包含一个英文的通用模型

三、使用示例

1.模型选择

可以选择使用自带的也就是上文中share文件夹包含的通用模型
在这里插入图片描述

如果想使用中文模型需要在通用模型下载地址下载,选择中文模型
在这里插入图片描述
模型解压后
在这里插入图片描述

2.代码示例

代码如下,我使用了麦克风的声音,所以会用到sox插件,这个读者可以自行更改:


#include <pocketsphinx.h>
#include <signal.h>static int global_done = 0;
static void
catch_sig(int signum)
{(void)signum;global_done = 1;
}#ifdef WIN32
#define popen _popen
#define pclose _pclose
#endifstatic FILE *
popen_sox(int sample_rate)
{char *soxcmd;int len;FILE *sox;
#define SOXCMD "sox -q -r %d -c 1 -b 16 -e signed-integer -d -t raw -"len = snprintf(NULL, 0, SOXCMD, sample_rate);if ((soxcmd = (char*)malloc(len + 1)) == NULL)E_FATAL_SYSTEM("Failed to allocate string");if (snprintf(soxcmd, len + 1, SOXCMD, sample_rate) != len)E_FATAL_SYSTEM("snprintf() failed");if ((sox = popen(soxcmd, "r")) == NULL)E_FATAL_SYSTEM("Failed to popen(%s)", soxcmd);free(soxcmd);return sox;
}int
main(int argc, char *argv[])
{ps_decoder_t *decoder;ps_config_t *config;ps_endpointer_t *ep;FILE *sox;short *frame;size_t frame_size;(void)argc; (void)argv;config = ps_config_init(NULL);ps_default_search_args(config);//en// ps_config_set_str(config, "dict", "/home/aaron/workplace/audioread/pocketsphinx/build/share/pocketsphinx/model/en-us/cmudict-en-us.dict");// ps_config_set_str(config, "lm", "/home/aaron/workplace/audioread/pocketsphinx/build/share/pocketsphinx/model/en-us/en-us.lm.bin");//chinaps_config_set_str(config, "hmm", "/home/aaron/workplace/audioread/ceshi/pocketsphinx/pocketsphinxtest/third/cmusphinx/zh_cn.cd_cont_5000");ps_config_set_str(config, "dict", "/home/aaron/workplace/audioread/ceshi/pocketsphinx/pocketsphinxtest/third/cmusphinx/zh_cn.dic");ps_config_set_str(config, "lm", "/home/aaron/workplace/audioread/ceshi/pocketsphinx/pocketsphinxtest/third/cmusphinx/zh_cn.lm.bin");if ((decoder = ps_init(config)) == NULL)E_FATAL("PocketSphinx decoder init failed\n");if ((ep = ps_endpointer_init(0, 0.0, (ps_vad_mode_t)0, 0, 0)) == NULL)E_FATAL("PocketSphinx endpointer init failed\n");sox = popen_sox(ps_endpointer_sample_rate(ep));frame_size = ps_endpointer_frame_size(ep);if ((frame = (short int *)malloc(frame_size * sizeof(frame[0]))) == NULL)E_FATAL_SYSTEM("Failed to allocate frame");if (signal(SIGINT, catch_sig) == SIG_ERR)E_FATAL_SYSTEM("Failed to set SIGINT handler");while (!global_done) {const int16 *speech;int prev_in_speech = ps_endpointer_in_speech(ep);size_t len, end_samples;if ((len = fread(frame, sizeof(frame[0]),frame_size, sox)) != frame_size) {if (len > 0) {speech = ps_endpointer_end_stream(ep, frame,frame_size,&end_samples);}elsebreak;} else {speech = ps_endpointer_process(ep, frame);}if (speech != NULL) {const char *hyp;if (!prev_in_speech) {fprintf(stderr, "Speech start at %.2f\n",ps_endpointer_speech_start(ep));ps_start_utt(decoder);}if (ps_process_raw(decoder, speech, frame_size, FALSE, FALSE) < 0)E_FATAL("ps_process_raw() failed\n");if ((hyp = ps_get_hyp(decoder, NULL)) != NULL)fprintf(stderr, "PARTIAL RESULT: %s\n", hyp);if (!ps_endpointer_in_speech(ep)) {fprintf(stderr, "Speech end at %.2f\n",ps_endpointer_speech_end(ep));ps_end_utt(decoder);if ((hyp = ps_get_hyp(decoder, NULL)) != NULL)printf("%s\n", hyp);}}}free(frame);if (pclose(sox) < 0)E_ERROR_SYSTEM("Failed to pclose(sox)");ps_endpointer_free(ep);ps_free(decoder);ps_config_free(config);return 0;
}

结果如下:
在这里插入图片描述

3.自定义字典

  • 打开一个txt,输入想指定的词典,尽量多几行,单行不识别
    在这里插入图片描述
  • 通过自定义模型库工具地址网址进行上传,选择文件后点击comple knowledge base按钮
    在这里插入图片描述
  • 点击comple knowledge base按钮后,下载对应的包解压
    在这里插入图片描述
  • 解压后,可以看到存在dic字典,再把后缀为.lm文件重命名为.lm.bin
    在这里插入图片描述
  • 打开0047.dic和之前的通用模型zh_cn.dic,对照zh_cn.dic0047.dic中添加英译,如果不存在就搜单个字音译,这个规律很好找,数字代表的声调

在这里插入图片描述

  • 替换到模型里,指定当前的词典,那么只会针对词典里的词进行识别了

四、交叉编译

交叉工具选择aarch64

# aarch64_toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_ASM_COMPILER aarch64-linux-gnu-as)
set(CMAKE_LINKER aarch64-linux-gnu-ld)
set(CMAKE_STRIP aarch64-linux-gnu-strip)
set(CMAKE_OBJCOPY aarch64-linux-gnu-objcopy)
set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_OBJDUMP aarch64-linux-gnu-objdump)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)这一行比较重要,我在交叉编译时发现找不到对应的libm库,加了这一行才找到

cmake .. -DCMAKE_TOOLCHAIN_FILE=/toolchain.cmake -DCMAKE_INSTALL_PREFIX=./ -DCMAKE_EXE_LINKER_FLAGS="-lm"
make
make install

结果:
在这里插入图片描述


总结

本来想把其他几个开源语音识别引擎也初步记录一下的,看以后有没有时间吧,使用pocketsphinx是为了满足低资源消耗,等实际测试后再重新记录到这篇博客里面吧

如果对您有所帮助,请帮忙点个赞吧!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C语言原码、反码和补码的详解

C语言原码、反码和补码的详解 放在最前面的1、前言正数的原码、反码和补码负数的原码、反码和补码 2、整数的原码&#xff08;2.1&#xff09;原码的定义&#xff08;2.2&#xff09;计算原码 3、整数的反码&#xff08;3.1&#xff09;反码的定义&#xff08;3.2&#xff09;计…

知识课堂——高匿ip在不同业务中的重要作用

大家好&#xff01;今天我们来看看高匿ip在不同业务中都能起到什么样的重要作用。第一个会用到的地方就是网络数据采集&#xff0c;也被称为网络爬虫&#xff0c;在是许多企业和机构获取大量数据的重要手段。例如市场调研公司帮助企业制定市场策略就需要收集各个行业的产品价格…

【青牛科技】GC8548替代LV8548/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析

引言 在现代电子设备中&#xff0c;控制芯片的选择对产品的性能和可靠性至关重要。摇头机、舞台灯、打印机和白色家电等领域对芯片的要求日益增加&#xff0c;传统上多采用LV8548/ONSEMI等国际品牌的芯片。然而&#xff0c;随着国内半导体技术的不断进步&#xff0c;芯麦GC854…

【C/C++】字符/字符串函数(0)——由ctype.h提供

零.导言 众所周知&#xff0c;C语言的字符有许多不同的类型&#xff0c;如&#xff1a;数字&#xff0c;字母&#xff0c;标点符号等等等等。 今天&#xff0c;我就给大家讲解一下用于实现字符分类的函数——字符分类函数。 一.什么是字符分类函数&#xff1f; 即实现字符分类的…

专业网页设计服务重要是什么

当在搜索引擎中键入“网页设计”&#xff0c;您将获得超过2000万个相关结果。在如此众多的网站制作公司中&#xff0c;应该如何做出明智的选择呢&#xff1f;首先&#xff0c;让我们深入探讨一下网页设计的重要性。网站设计需要综合各种不同领域的专业知识&#xff0c;它是一个…

【CanMV K230】windows部署AICube,训练模型

【CanMV K230】windows部署AICube&#xff0c;训练模型 dotnet sdk的下载链接配置环境 AI_Cube安装训练AI_Cube安装模型训练 在开发板上运行模型 B站视频链接&#xff1a;《K230 实战》windows系统下使用AI_Cube,训练模型 AI Cube 是由嘉楠科技开发的一款通用视觉 AI 计算平台&…

力扣每日一题 超级饮料的最大强化能量 动态规划(dp)

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB&#xff0c;数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。 你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而&#xff0c;如果从一种能量饮料切换到…

RK3568平台开发系列讲解(字符设备驱动篇)注册字符设备

🚀返回专栏总目录 文章目录 一、字符设备初始化二、字符设备的注册和注销沉淀、分享、成长,让自己和他人都能有所收获!😄 📢注册字符设备可以分为两个步骤: 字符设备初始化字符设备的添加一、字符设备初始化 字符设备初始化所用到的函数为 cdev_init(…),在对该函数讲…

在 Scnet 上微调 Stable Diffusion 3 模型

1 AI 算力反馈 1.1 运行的商品名称 我运行的商品为 Stable Diffusion 3 文本到图像高质量生成AI绘画推理服务&#xff0c;运行的环境为 异构加速卡AI 64G。具体创建流程如下&#xff1a; 1.1.1 购买模型服务 首先购买一下模型服务&#xff0c;这样我们就不需要再从 Hugging…

ffmpeg命令——从wireshark包中的rtp包中分离h264

ffmpeg命令——从wireshark包中的rtp包中分离h264 过滤 RTP打开wireshark的RTP 播放器选中流并导出荷载使用 ffmpeg 命令行分离出 h264 过滤 RTP 打开wireshark的RTP 播放器 选中流并导出荷载 使用 ffmpeg 命令行分离出 h264 ffmpeg -i test.raw -vcodec copy -an -f h264 tes…

机器学习(二)——线性回归模型、多分类学习(附核心思想和Python实现源码)

目录 关于1. 基本形式2. 线性回归2.1 单变量线性回归2.2 多元线性回归2.2 对数线性回归 3. 对数几率回归4. 线性判别分析5. 多分类学习5.1 拆分策略 6. 类别不平衡问题X 案例代码X.1 源码X.2 数据集&#xff08;糖尿病数据集&#xff09;X.3 模型效果 关于 本文是基于西瓜书&a…

【机器学习】22. 聚类cluster - K-means

聚类cluster - K-means 1. 定义2. 测量数据点之间的相似性3. Centroid and medoid4. Cluster之间距离的测量方式5. 聚类算法的类别6. K-mean7. 如何解决中心初始化带来的影响8. K-means问题&#xff1a;处理空集群9. 离群值的问题10. Bisecting K-means&#xff08;二分K-means…

【python_pandas_将列表按照某几列进行分组,再求和,按照原列表的字段顺序返回】

说明&#xff1a; 1、按照[“行描述”,”‘公司代码’, ‘科目代码’, ‘预算项目代码’] 进行分组。 2、对“贷方”列进行求和。 3、最后按照之前的表头顺序进行排序&#xff0c;返回结果列表。 #-*- coding:utf-8-*import pandas as pd def consolidate_salary_provisions(l…

【Vue框架】基础语法练习(1)

其实更多知识点已经在Vue.js官网十分清楚了&#xff0c;大家也可以去官网进行更细节的学习 https://cn.vuejs.org/ 说明&#xff1a;目前最新是Vue3版本的&#xff0c;但是Vue2已经深得人心&#xff0c;所以就是可以支持二者合用。它们最大的区别就是Vue3是组合式API&#xf…

公司如何防止员工泄密?十佳措施拒绝泄密,公司防泄密刻不容缓! (2024最强科普)

如何有效防止员工泄露机密&#xff1f; 作为公司的经营者&#xff0c;您是否意识到了商业秘密的重要性&#xff1f;您是否已经知道应该采取什么样的措施才能保护好自己的商业秘密&#xff1f; 员工的泄密行为不仅可能造成重大的经济损失&#xff0c;还会对企业的声誉造成严重…

[大模型]视频生成-Sora简析

参考资料&#xff1a; Sora技术报告https://openai.com/index/video-generation-models-as-world-simulators/4分钟详细揭密&#xff01;Sora视频生成模型原理https://www.bilibili.com/video/BV1AW421K7Ut 一、概述 相较于Gen-2、Stable Diffusion、Pika等生成模型的前辈&am…

linux中级(防火墙firewalld)

一。firewalld与iptables区别1.firewalld可以动态修改单条规则&#xff0c;不需要像iptables那样&#xff0c;修改规则后必须全部刷新才可生效。firewalld默认动作是拒绝&#xff0c;则每个服务都需要去设置才能放行&#xff0c;而iptables里默认是每个服务是允许&#xff0c;需…

【C/C++】memcpy函数的使用

零.导言 当我们学习了strcpy和strncpy函数后&#xff0c;也许会疑惑整形数组要如何拷贝&#xff0c;而今天我将讲解的memcpy函数便可以拷贝整形数组。 一.memcpy函数的使用 memcpy函数是一种C语言内存函数&#xff0c;可以按字节拷贝任意类型的数组&#xff0c;比如整形数组。 …

软件测试用例设计:从功能测试到边界值分析

功能测试介绍 功能测试是软件测试的一种重要方式&#xff0c;通过对软件的功能进行测试&#xff0c;来验证软件是否满足需求规格说明书中的各项功能要求。例如&#xff0c;对于一个简单的计算器软件&#xff0c;功能测试的用例可能包括加减乘除等基本运算&#xff0c;以及各种特…

[论文阅读]BERT-based Lexical Substitution

BERT-based Lexical Substitution 基于BERT的词汇替换 ACL2019 BERT-based Lexical Substitution - ACL Anthology 以前关于词汇替换的研究倾向于通过从词汇资源&#xff08;例如 WordNet&#xff09;中找到目标词的同义词来获得替代候选词&#xff0c;然后根据其上下文对候…