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/9553.html

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

相关文章

中国自主品牌荣耀时刻:海豹荣获欧洲车身大奖

近日&#xff0c;在德国巴特瑙海姆举行的2024欧洲车身大会上&#xff0c;比亚迪海豹凭借其卓越的车身架构设计、创新技术和美学设计&#xff0c;一举斩获了本次大赛第三名的殊荣。 这不仅是中国自主品牌在欧洲车身大会上的首次获奖&#xff0c;而且也是比亚迪技术创新与实力在国…

RocketMQ 广播消息

所谓的广播消息就是发送的一条消息会被多个消费者收到。 ⼴播是向主题&#xff08; topic &#xff09;的所有订阅者发送消息。订阅同⼀个 topic 的多个消费者&#xff0c;能全量收到⽣产者发送的所有消息。 生产者发送了10个order&#xff0c;每个order里面有5个消息&#xff…

如何实现智慧园区的节能降耗?

江园科技智慧园区实现智慧园区节能降耗可以从以下几个方面入手&#xff1a; 能源监测与管理系统 - 安装智能电表、水表和气表等设备&#xff0c;实时精准地监测园区内各区域、各企业及各设备的能源消耗情况&#xff0c;如电量的峰谷时段使用量、用水量的波动等。这些数据会传输…

索引【MySQL】

文章目录 聚簇索引 VS 非聚簇索引索引MySQL与磁盘交互的基本单位主键索引索引操作唯一索引的创建普通索引的创建复合索引 索引创建原则 聚簇索引 VS 非聚簇索引 MyISAM存储引擎 - 主键索引结构 MyISAM存储引擎同样采用B树作为索引的基本数据结构 与InnoDB存储引擎的B树不同的…

CDH大数据平台部署

二、CDH简介 全称Cloudera’s Distribution Including Apache Hadoop。 hadoop的版本 (Apache、CDH、Hotonworks版本) 在公司中一般使用cdh多一些&#xff08;收费的&#xff09;、也有公司使用阿里云大数据平台、微软的大数据平台。 国内也有一些平台&#xff1a;星环大数…

如何删除苹果手机所有照片:彻底清理指南

随着时间的推移&#xff0c;我们的iPhone往往会积累大量照片&#xff0c;这些照片占据了大量存储空间并可能影响设备性能。有时&#xff0c;为了快速释放空间或重置手机内容&#xff0c;您可能需要了解如何删除苹果手机所有照片。别担心&#xff0c;本文将向你讲解如何删除苹果…

JAVA开源项目 服装销售平台 计算机毕业设计

博主说明&#xff1a;本文项目编号 T 054 &#xff0c;文末自助获取源码 \color{red}{T054&#xff0c;文末自助获取源码} T054&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

Spire.PDF for .NET【页面设置】演示:获取 PDF 文件中的页数

计算 PDF 文件中的页数对于各种目的都至关重要&#xff0c;例如确定文档长度、组织内容和评估打印要求。除了使用 PDF 查看器了解页数信息外&#xff0c;您还可以通过编程自动执行该任务。在本文中&#xff0c;您将学习如何使用C#通过Spire.PDF for .NET获取 PDF 文件中的页数。…

面试总结!

OSI七层模型&#xff1a; 什么是OSI七层模型&#xff1f; 我们需要了解互联网的本质是一系列的网络协议&#xff0c;这个协议就叫做OSI协议&#xff08;开放系统互联(Open System Interconnection&#xff09;&#xff09;&#xff0c;它是由ISO&#xff08;国际标准化组织&…

LeetCode:102. 二叉树的层序遍历(java)

目录 题目描述: 代码: 第一种: 第二种: TreeNode: LinkedListNode: 题目描述: 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,…

R语言实战——一些批量对地理数据进行操作的方法

各位朋友在进行数据处理时&#xff0c;当有多张栅格影像时&#xff0c;如果我们都要进行同一操作时&#xff0c;一张一张做很繁琐&#xff0c;用ArcGIS模型构建器是一种比较好的方法。当然&#xff0c;今天小编新学了R语言上面进行批量裁剪&#xff0c;一起来学习一下吧&#x…

TEMU测评:在挑战与机遇中寻求突破

近年来&#xff0c;TEMU&#xff08;由拼多多推出的海外电商平台&#xff09;在全球范围内迅速崛起&#xff0c;特别是在美国市场&#xff0c;其以极具竞争力的价格和丰富的商品种类吸引了大量海外消费者。然而&#xff0c;随着市场竞争的加剧和外部环境的变化&#xff0c;TEMU…

BIM 地铁站智能可视化应用

运用图扑数字孪生结合建筑信息建模&#xff08;BIM&#xff09;技术&#xff0c;提供地铁站结构和设施的全方位三维可视化展示。支持施工方案优化、进度管理及协同操作&#xff0c;提高设计精度和施工效率&#xff0c;保障地铁项目的全生命周期管理。

C++研发笔记12——C语言程序设计初阶学习笔记10

本篇笔记是一篇练习文章&#xff0c;是对第二部分《初识C语言》的一个回顾&#xff0c;从而结束第二部分的学习。 题目一 关于C语言关键字说法正确的是&#xff1a;( ) A.关键字可以自己创建 B.关键字不能自己创建 C.关键字可以做变量名 D.typedef不是关键字 【参考答案…

【论文笔记】SparseRadNet: Sparse Perception Neural Network on Subsampled Radar Data

原文链接&#xff1a;https://arxiv.org/abs/2406.10600 简介&#xff1a;本文引入自适应子采样方法和定制网络&#xff0c;利用稀疏性模式发掘雷达信号中的全局和局部依赖性。本文的子采样模块选择 RD谱中在下游任务贡献最大 像素 的子集。为提高子采样数据的特征提取&#xf…

【IEEE出版|连续5年稳定EI检索|易中稿!近距离交流院士、Fellow!】第六届国际科技创新学术交流大会暨机械工程与自动化国际学术会议(MEA 2024)

第六届国际科技创新学术交流大会暨机械工程与自动化国际学术会议&#xff08;MEA 2024&#xff09; 2024 6th International Conference on Mechanical Engineering and Automation 重要信息 会议官网&#xff1a;mea2024.iaecst.org&#xff08;会议关键词&#xff1a;MEA 2…

计算机图形学论文 | 木工设计与制造计划的共同优化

&#x1f98c;&#x1f98c;&#x1f98c;读论文 我们的系统共同探索离散设计变量和制造计划的空间&#xff0c;以生成&#xff08;设计&#xff0c;制造计划&#xff09;对的帕累托前沿&#xff0c;使制造成本最小化。在该图中&#xff0c;(a)是椅子的输入设计和仅探索该设计的…

Kubernetes-ArgoCD篇-02-安装

1、安装 1.1 Argo CD CLI mac安装&#xff1a; brew install argocd通用安装&#xff1a; # 查看os go env GOOS # 查看架构 go env GOARCHargoCdName"argocd-darwin-arm64" # 此步骤也可以手动下载 wget https://github.com/argoproj/argo-cd/releases/latest/d…

【Ant Design Pro】框架入门的起手式及架构的分析

框架千千万万&#xff0c;换个公司换个样&#xff01;umijs官网地址在这里&#xff0c;都要喊它father!! 作为笔记&#xff0c;了解框架结构。官网地址:Ant Design Pro。 项目环境 node 版本18依赖安装淘宝镜像&#xff0c;npm i大概要2~3分钟&#xff0c;感觉这种框架很重 安…

【数据分享】2024年我国省市县三级的生活服务设施数量(46类设施/Excel/Shp格式)

人才市场、售票处、旅行社等生活服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市生活服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、…