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数字人直播很多人想的…

服务器被挂马怎么办?——解决服务器被挂马的方法和步骤

服务器被挂马&#xff08;即被植入恶意软件&#xff09;是一个常见的网络安全问题&#xff0c;可能导致数据泄露、服务中断和经济损失。本文将详细介绍如何检测和清除服务器上的恶意软件&#xff0c;并提供实用的代码示例&#xff0c;帮助读者解决服务器被挂马的问题。 一、什…

飞牛私有云访问外网

飞牛私有云 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领…

KUKU FM 音频Linux平台免费下载工具

1.工具名称&#xff1a;kuku-dl 功能&#xff1a; ✅ 下载播客、故事和有声读物&#xff01; ✅ 获取所有元数据和封面艺术品。 ✅ 支持字幕&#xff01; 3.使用说明&#xff1a; 3.1. 直接镜像github源码库 &#x1f449; git clone https://github.com/bunnykek/kuku-…

相机光学(四十)——2x2 Adjacent Pixel Binning

1.什么是2x2 Adjacent Pixel Binning 2x2 Adjacent Pixel Binning 是一种图像传感器技术&#xff0c;用于将相邻的像素合并以提高图像的信噪比&#xff08;SNR&#xff09;和降低图像数据量&#xff0c;从而可能提高帧率或减少处理资源的需求。具体来说&#xff0c;这种技术涉及…

一文窥见神经网络

一文窥见神经网络 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…

Python函数专题:高阶函数

在Python编程中,高阶函数是一个非常重要的概念,它为我们提供了更高的抽象能力。高阶函数不仅可以接受其他函数作为参数,还可以返回一个函数。通过使用高阶函数,我们可以更简洁地表达逻辑,从而提高代码的可读性和可维护性。 本文将深入探讨高阶函数的概念、类型和实际应用…

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

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

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

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

Rust:GUI 开源框架

Rust的GUI代码包有多个选择&#xff0c;每个都有其独特的特点和优势。以下是一些比较受欢迎的Rust GUI库&#xff0c;以及它们的主要特点和适用场景&#xff1a; KAS GUI&#xff1a; 特点&#xff1a;基于Rust语言开发的状态化图形用户界面&#xff08;GUI&#xff09;框架&am…

三、模板与配置(下)

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

【Leetcode热题100】C++ 题解

目录 哈希 两数之和 字母异位词分组 最长连续序列 双指针 移动零 盛最多水的容器 三数之和 接雨水 滑动窗口 无重复字符的最长子串 找到字符串中所有字母异位词 子串 和为k的子数组 滑动窗口最大值 最小覆盖子串 普通数组 最大子数组和 合并区间 轮转数组 …