ubuntu使用DeepSpeech进行语音识别(包含交叉编译)

文章目录

  • 前言
  • 一、DeepSpeech编译
  • 二、DeepSpeech使用示例
  • 三、核心代码分析
    • 1.创建模型核心代码
    • 2.识别过程核心代码
  • 四、交叉编译
    • 1.交叉编译
    • 2.使用
  • 总结


前言

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

本篇博客将会在ubuntu上进行DeepSpeech编译使用,并且进行交叉编译。

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


一、DeepSpeech编译

如果想先自己编编看,可以先看这里,如果想直接使用库文件等,可以跳过本节,下文会标注出官方支持的各种平台已经编好的二进制文件。

不过博主还是建议先自己编编看,因为源码中有一个文件是官方的示例文档,还是值得一看的。

  • 下载依赖项
sudo apt-get update
sudo apt-get install -y \build-essential \libatlas-base-dev \libfftw3-dev \libgfortran5 \sox \libsox-devsudo apt-get install libmagic-dev
  • 下载DeepSpeech源码
git clone https://github.com/mozilla/DeepSpeech.git
cd DeepSpeech
git submodule sync tensorflow/
git submodule update --init tensorflow/
  • DeepSpeech是使用bazel构建的,下载bazel
sudo apt install curl
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo apt update && sudo apt install bazel
  • 配置tensorlow
cd tensorflow
./configure
ln -s ../native_client

如果native_client不存在,使用native_client进行创建

  • 编译

只需要库文件

bazel build --workspace_status_command="bash native_client/bazel_workspace_status_cmd.sh" --config=monolithic -c opt --copt=-O3 --copt="-D_GLIBCXX_USE_CXX11_ABI=0" --copt=-fvisibility=hidden //native_client:libdeepspeech.so

库和可执行文件

bazel build --workspace_status_command="bash native_client/bazel_workspace_status_cmd.sh" --config=monolithic -c opt --copt=-O3 --copt="-D_GLIBCXX_USE_CXX11_ABI=0" --copt=-fvisibility=hidden //native_client:libdeepspeech.so //native_client:generate_scorer_package

native_client存在deepspeech可执行文件,值得注意的是,头文件是deepspeech.hclient.cc是C++示例文件
在这里插入图片描述
tensorflow/baze-bin/native_client下存在对应库文件
在这里插入图片描述

二、DeepSpeech使用示例

模型下载地址

模型文件:deepspeech-0.9.3-models-zh-CN.pbmm
打分文件:deepspeech-0.9.3-models-zh-CN.scorer
在这里插入图片描述

./deepspeech --model /home/aaron/workplace/audioread/deepspeech-0.9.3-models-zh-CN.pbmm --scorer /home/aaron/workplace/audioread/deepspeech-0.9.3-models-zh-CN.scorer --audio /home/aaron/workplace/audioread/test.wav

在这里插入图片描述

三、核心代码分析

核心代码是上文提到client.cc文件中的示例代码

1.创建模型核心代码

// Initialise DeepSpeechModelState* ctx;// sphinx-doc: c_ref_model_startint status = DS_CreateModel(model, &ctx);if (status != 0) {char* error = DS_ErrorCodeToErrorMessage(status);fprintf(stderr, "Could not create model: %s\n", error);free(error);return 1;}if (set_beamwidth) {status = DS_SetModelBeamWidth(ctx, beam_width);if (status != 0) {fprintf(stderr, "Could not set model beam width.\n");return 1;}}if (scorer) {status = DS_EnableExternalScorer(ctx, scorer);if (status != 0) {fprintf(stderr, "Could not enable external scorer.\n");return 1;}if (set_alphabeta) {status = DS_SetScorerAlphaBeta(ctx, lm_alpha, lm_beta);if (status != 0) {fprintf(stderr, "Error setting scorer alpha and beta.\n");return 1;}}}// sphinx-doc: c_ref_model_stopstatus = DS_AddHotWord(ctx, word, boost);if (status != 0) {fprintf(stderr, "Could not enable hot-word.\n");return 1;}
  • DS_CreateModel:创建模型
  • DS_SetModelBeamWidth:设置搜索空间宽度,值越大,越准确,但会增大开销
  • DS_EnableExternalScorer:设置评分器
  • DS_SetScorerAlphaBeta:设置声学模型和语言模型参数。Alpha 参数:影响语言模型的权重;Beta 参数:影响语言模型中候选路径的惩罚机制。
  • DS_AddHotWord:设置某些特定词汇或短语被识别为更优先的目标词汇

2.识别过程核心代码

if (extended_output) {Metadata *result = DS_SpeechToTextWithMetadata(aCtx, aBuffer, aBufferSize, 1);res.string = CandidateTranscriptToString(&result->transcripts[0]);DS_FreeMetadata(result);} else if (json_output) {Metadata *result = DS_SpeechToTextWithMetadata(aCtx, aBuffer, aBufferSize, json_candidate_transcripts);res.string = MetadataToJSON(result);DS_FreeMetadata(result);} else if (stream_size > 0) {StreamingState* ctx;int status = DS_CreateStream(aCtx, &ctx);if (status != DS_ERR_OK) {res.string = strdup("");return res;}size_t off = 0;const char *last = nullptr;const char *prev = nullptr;while (off < aBufferSize) {size_t cur = aBufferSize - off > stream_size ? stream_size : aBufferSize - off;DS_FeedAudioContent(ctx, aBuffer + off, cur);off += cur;prev = last;const char* partial = DS_IntermediateDecode(ctx);if (last == nullptr || strcmp(last, partial)) {printf("%s\n", partial);last = partial;} else {DS_FreeString((char *) partial);}if (prev != nullptr && prev != last) {DS_FreeString((char *) prev);}}if (last != nullptr) {DS_FreeString((char *) last);}res.string = DS_FinishStream(ctx);} else if (extended_stream_size > 0) {StreamingState* ctx;int status = DS_CreateStream(aCtx, &ctx);if (status != DS_ERR_OK) {res.string = strdup("");return res;}size_t off = 0;const char *last = nullptr;const char *prev = nullptr;while (off < aBufferSize) {size_t cur = aBufferSize - off > extended_stream_size ? extended_stream_size : aBufferSize - off;DS_FeedAudioContent(ctx, aBuffer + off, cur);off += cur;prev = last;const Metadata* result = DS_IntermediateDecodeWithMetadata(ctx, 1);const char* partial = CandidateTranscriptToString(&result->transcripts[0]);if (last == nullptr || strcmp(last, partial)) {printf("%s\n", partial);last = partial;} else {free((char *) partial);}if (prev != nullptr && prev != last) {free((char *) prev);}DS_FreeMetadata((Metadata *)result);}const Metadata* result = DS_FinishStreamWithMetadata(ctx, 1);res.string = CandidateTranscriptToString(&result->transcripts[0]);DS_FreeMetadata((Metadata *)result);free((char *) last);} else {res.string = DS_SpeechToText(aCtx, aBuffer, aBufferSize);}

最核心的deepspeech接口:

函数名输入输出适用场景优缺点
DS_SpeechToText完整音频数据完整识别文本适用于一次性处理音频文件的场景简单直接,适用于批量处理,但不能处理实时流
DS_SpeechToTextWithMetadata完整音频数据完整识别文本 + 元数据(如时间戳等)适用于需要每个词或音节时间戳的场景更详细的输出,适用于字幕等场景,但复杂度略高
DS_IntermediateDecode流式输入音频数据(逐段)逐步输出识别文本适用于实时语音识别场景,如语音助手、实时转录等低延迟输出,适合流式处理,但可能不精确
DS_IntermediateDecodeWithMetadata流式输入音频数据(逐段)逐步输出识别文本 + 元数据适用于实时语音识别,且需要获取词级时间戳和置信度等详细信息更全面的输出,适用于实时字幕等场景,但复杂度更高

值得注意的是:如果是文件中语音识别,应该是使用前两个,如果是流式需要考虑延时或实时语音,应该使用后面两个

四、交叉编译

1.交叉编译

非常不建议自己进行交叉编译,建议直接使用官方版本,因为如果使用交叉编译,需要在tensflow那边就开始设置交叉编译环境,并且虽然bazel工具中存在对于aarch64环境的脚本提示(在隐藏文件.bazelrc里)

build:elinux_aarch64 --config=elinux
build:elinux_aarch64 --cpu=aarch64

但笔者尝试过,会报各种各样的错误。

官方编译好的文件,各种平台都支持,下图是版本
在这里插入图片描述

各种平台的文件,根据需要下载
在这里插入图片描述

解压后
在这里插入图片描述

2.使用

值得注意的是,如果是在linux aarch64环境下,那么使用的model受到资源限制,应该使用的是.tflite而非pbmm
在这里插入图片描述

在rk芯片上的使用结果,实际上比较消耗性能
在这里插入图片描述


总结

目前已经尝试过vosk、PocketSphinx,有兴趣的话可以看看之前的文章,实际上还有两个没有记录出来,Snowboy和Julius,有兴趣的小伙伴可以一起探讨。

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

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

相关文章

Go语言入门教案

文章目录 一、教学目标二、教学重难点&#xff08;一&#xff09;重点&#xff08;二&#xff09;难点 三、教学方法四、教学过程&#xff08;一&#xff09;Go语言简介&#xff08;二&#xff09;环境搭建1. 下载和安装Go语言开发环境2. 配置Go语言环境变量3. 命令行查看Go语言…

普通人如何做好AI数字人直播带货月入10W?

在科技飞速发展的今天&#xff0c;AI数字人直播正以惊人的速度崛起&#xff0c;为直播领域带来了一场前所未有的变革。那到底AI数字人直播前景怎么样&#xff0c;是怎样一个形式&#xff0c;普通人能够利用Ai数字人直播赚取到收益吗&#xff1f; 首先讲到AI数字人直播很多人想的…

飞牛私有云访问外网

飞牛私有云 fnOS NAS 是一款有着卓越的性能以及强大的兼容性和智能化的管理界面&#xff0c;它之所以能在 NAS 市场中脱颖而出&#xff0c;是因为 fnOS 基于最新的 Linux 内核&#xff08;Debian发行版&#xff09;深度开发&#xff0c;不仅兼容主流 x86 硬件&#xff0c;还支持…

论文 | The Capacity for Moral Self-Correction in LargeLanguage Models

概述 论文探讨了大规模语言模型是否具备“道德自我校正”的能力&#xff0c;即在收到相应指令时避免产生有害或偏见输出的能力。研究发现&#xff0c;当模型参数达到一定规模&#xff08;至少22B参数&#xff09;并经过人类反馈强化学习&#xff08;RLHF&#xff09;训练后&…

计算机毕业设计Python+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

一文窥见神经网络

一文窥见神经网络 1.初识神经元1.1 生物神经元1.2 人工神经元1.3 权重的作用1.4 偏置的作用1.5 激活函数的作用1.5.1 线性激活函数1.5.2 非线性激活函数 2. 神经元模型2.1 多输入单神经元模型2.2 一层神经元模型2.3 神经网络&#xff08;多层神经元&#xff09;模型 3. 神经网络…

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

shell 100例

1、每天写一个文件 (题目要求&#xff09; 请按照这样的日期格式(xxxx-xx-xx每日生成一个文件 例如生成的文件为2017-12-20.log&#xff0c;并且把磁盘的使用情况写到到这个文件中不用考虑cron&#xff0c;仅仅写脚本即可 [核心要点] date命令用法 df命令 知识补充&#xff1…

[Python学习日记-66] 多态与多态性

[Python学习日记-66] 多态与多态性 简介 多态 多态性 鸭子类型 简介 多态与多态性都是面向对象的特征之一&#xff0c;它们都是面向对象编程的一个重要概念&#xff0c;在 Python 当中也有一些独特的见解和用法&#xff0c;下面我们一起来了解一下是怎么回事吧。 多态 多态…

Linux基础1

Linux基础1 Linux基础1学习笔记 ‍ 声明&#xff01; ​​​学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他…

GESP4级考试语法知识(贪心算法(二))

排队接水2代码&#xff1a; #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct people {int num;int time; }; people s[1001]; int n,r,a[1001]; double sum,ave; bool cmp(people x,people y) {return x.time<y.t…

MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?

文章目录 MySQL45讲 第二十讲 幻读是什么&#xff0c;幻读有什么问题&#xff1f;一、幻读的定义二、幻读带来的问题&#xff08;一&#xff09;语义问题&#xff08;二&#xff09;数据一致性问题 三、InnoDB 解决幻读的方法四、总结 MySQL45讲 第二十讲 幻读是什么&#xff0…

【再谈设计模式】建造者模式~对象构建的指挥家

一、引言 在软件开发的世界里&#xff0c;创建对象是一项基本且频繁的操作。然而&#xff0c;当对象的构造变得复杂&#xff0c;涉及众多属性和初始化步骤时&#xff0c;传统的构造函数方式往往会让代码陷入混乱的泥沼。就如同搭建一座复杂的建筑&#xff0c;若没有合理的规划和…

三、模板与配置(下)

三、模板与配置 8、WXSS模板样式-全局样式和局部样式 类型说明适用情景注意点全局样式定义在 app.wxss 中的样式&#xff0c;作用于每一个页面。当有一些通用的样式规则需要应用于整个小程序时&#xff0c;比如全局的字体大小、颜色、布局等。全局样式可能会被局部样式覆盖&a…

SQL面试题——抖音SQL面试题 主播播出时长

主播播出时长 现有如下数据,主播id、房间号、播出的批次号,每个批次号进出房间的时间戳、分区时间: 每一次直播都有一个上播和下播,每个房间里,同一个批次号会有两条数据,分别记录了上播和下播时间,求每个主播的播出时长? 通过上面的数据,可以清晰的看出,同一个批次…

大语言模型LLM综述

一、LM主要发展阶段 1.1、统计语言模型SLM 基于统计学习方法&#xff0c;基本思想是基于马尔可夫假设HMM建立词概率预测模型。如n-gram语言模型 1.2、神经语言模型NLM 基于神经网络来做词的分布式表示。如word2vec模型 1.3、 预训练语言模型PLM 预训练一个网络模型来做词表…

用 Python 从零开始创建神经网络(七):梯度下降(Gradient Descent)/导数(Derivatives)

梯度下降&#xff08;Gradient Descent&#xff09;/导数&#xff08;Derivatives&#xff09; 引言1. 参数对输出的影响2. 斜率&#xff08;The Slope&#xff09;3. 数值导数&#xff08;The Numerical Derivative&#xff09;4. 解析导数&#xff08;The Analytical Derivat…

防爆手机市场“百花齐放”,该怎么选?

在危险作业场景&#xff0c;如石化煤矿&#xff0c;通讯设备采购关系到提高生产效率‌&#xff0c;保障安全生产‌&#xff0c;‌符合法规要求‌。在应急救援通信场景&#xff0c;通讯设备采购&#xff0c;与保障救援行动的效率和准确性息息相关。而通信设备的性能参数是评估其…

似然函数解析

从贝叶斯定理引出似然函数 最大似然估计用来估计均值方差的 文心对似然函数的解释&#xff0c;注意 抛出正反的概率&#xff0c;就是固定均值方差的条件概率密度了

记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)

今天的工作需要自己录制的数据集来验证昨天的标定结果 用ORBSLAM3单目imu模式运行&#xff0c;mentor给的是一个rosbag格式的数据包&#xff0c;配置过程出了几个问题记录一下&#xff0c;沿配置流程写。 一.orbslam3编译安装 1.首先是安装各种依赖 这里不再赘述&#xff0…