当前位置: 首页 > news >正文

语音识别——使用Vosk进行语音识别

在这里插入图片描述

文章目录

  • 前言
  • 一、Vosk模型
    • 1.准备好所需要的语音包
    • 2.下载使用
  • 二、使用示例
    • 1.文件读取示例
    • 2.结合麦克风演示
  • 总结


前言

如何编译Vosk请参照之前的文章,ubuntu编译kaldi和vosk

Vosk是语音识别开源框架,支持二十+种语言 - 中文,英语,印度英语,德语,法语,西班牙语,葡萄牙语,俄语,土耳其语,越南语,意大利语,荷兰人,加泰罗尼亚语,阿拉伯, 希腊语, 波斯语, 菲律宾语,乌克兰语, 哈萨克语, 瑞典语, 日语, 世界语, 印地语, 捷克语, 波兰语, 乌兹别克语, 韩国语, 塔吉克语。

Vosk还支持设备上离线语音识别 ,包括Raspberry Pi,Android,iOS等,API接口简单,并且有多种语言支持,同时会识别语义,最终输出合理的语句。


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

一、Vosk模型

1.准备好所需要的语音包

在开始使用Vosk之前,需要拥有语音识别的模型,如图中拥有很多语音模型,中文、英文、西班牙、印度等等,Vosk模型库,需要外网才可以下载
在这里插入图片描述

2.下载使用

下载并进行解压后如下图所示,例如这里有简单英文、轻量级中文、和用于服务器处理的大型通用中文模型等,根据需要进行下载
在这里插入图片描述

解压后放在对应目录下,值得注意的是,是整个解压后的文件夹,而不是某一固定文件,一定要放在对应位置,不然使用时会直接崩溃,连报错都没有。
在这里插入图片描述

二、使用示例

1.文件读取示例

首先语音文件和模型需要准备好,示例中的语音文件是自己录下来的,模型vosk-model-cn-0.22是中文模型

#include <vosk_api.h>
#include <stdio.h>int main() {FILE *wavin;char buf[3200];int nread, final;VoskModel *model = vosk_model_new("vosk-model-cn-0.22");VoskRecognizer *recognizer = vosk_recognizer_new(model, 16000.0);wavin = fopen("test.wav", "rb");fseek(wavin, 44, SEEK_SET);while (!feof(wavin)) {nread = fread(buf, 1, sizeof(buf), wavin);final = vosk_recognizer_accept_waveform(recognizer, buf, nread);if (final) {printf("%s\n", vosk_recognizer_result(recognizer));} else {printf("%s\n", vosk_recognizer_partial_result(recognizer));}}printf("%s\n", vosk_recognizer_final_result(recognizer));vosk_recognizer_free(recognizer);vosk_model_free(model);fclose(wavin);return 0;
}

输出结果如下,partial是短时输出,text是识别语义后的输出:
在这里插入图片描述

  • vosk_model_new:加载模型
  • vosk_recognizer_new:创建语音识别实例
  • vosk_recognizer_accept_waveform:塞入语音数据(pcm格式)
  • vosk_recognizer_result:获取识别器的完整识别结果
  • vosk_recognizer_partial_result:返回当下识别结果,如果没有识别到,返回空

2.结合麦克风演示

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#include <vosk_api.h>
#include <iostream>
#include <cstdio>
#include <memory>
#include <array>#define SAMPLE_RATE 44100
#define BUFFER_SIZE 44100 * 2 * 2int main() {// 初始化 Vosk 模型VoskModel *model = vosk_model_new("vosk-model-cn-0.22");VoskRecognizer *recognizer = vosk_recognizer_new(model, SAMPLE_RATE);// 打开 ALSA 设备snd_pcm_t *pcm_handle;int ret = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_CAPTURE, 0);ret = snd_pcm_set_params(pcm_handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 1, SAMPLE_RATE, 1, 1000000); // 1秒char buffer[BUFFER_SIZE];int final_result;while (1) {// 从麦克风读取音频数据int nread = snd_pcm_readi(pcm_handle, buffer, BUFFER_SIZE / 2);if (nread < 0) {snd_pcm_recover(pcm_handle, nread, 0);continue;}// 将音频数据传递给 Voskfinal_result = vosk_recognizer_accept_waveform(recognizer, buffer, nread * 2);if (final_result) {printf("%s\n", vosk_recognizer_result(recognizer));} else {std::string strTest = vosk_recognizer_partial_result(recognizer);printf("%s\n", strTest.c_str());}}printf("%s\n", vosk_recognizer_final_result(recognizer));// 清理snd_pcm_close(pcm_handle);vosk_recognizer_free(recognizer);vosk_model_free(model);return 0;
}

识别到并且最终组成的语句如下:
在这里插入图片描述


总结

轻量级、资源消耗小的嵌入式设备进行语音识别使用Vosk是一个不错的选择,但是如果只是用于语音唤醒之类的,实际上应该有更好的选择。

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

http://www.lryc.cn/news/468786.html

相关文章:

  • element ui中el-image组件查看图片的坑
  • LabVIEW水质监测系统
  • SpringMVC之 文件上传和下载
  • LeetCode Hot 100:二分查找
  • 打包方式-jar和war的区别
  • 【论文+源码】基于spring boot的垃圾分类网站
  • 【C++ STL 模板类】pair 键值对
  • paddleocr使用FastDeploy 部署工具部署 rknn 模型
  • Apple Vision Pro市场表现分析:IDC最新数据揭示的真相
  • Mybatis-04.入门-JDBC
  • 拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索
  • 新手铲屎官求推荐,噪音低的宠物空气净化器应该用哪款
  • 玄机平台-应急响应-webshell查杀
  • LeetCode Hot 100:图论
  • tracert和ping的区别
  • 回归、分类模型的评估指标
  • k8s中如何将pod的标准输出日志输出到一个文件
  • 软件工程文档规范要点总结
  • Django 序列化serializers
  • 混个1024勋章
  • Java Spring Boot 项目开发示例指南
  • Python学习路线:从新手到专家
  • R实验——logistic回归、LDA、QDAKNN
  • Java 使用 itextpdf 自定义 生成 pdf
  • Rust小练习,编写井字棋
  • RabbitMQ 入门(八)SpringAMQP消息转换器
  • 【C++】一文带你深入理解C++异常机制
  • Qt之QObject
  • 鸿蒙到底是不是纯血?到底能不能走向世界?
  • 【Android】MVP架构