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

文章目录


前言

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

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

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


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

一、Vosk模型

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

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

2.下载使用

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

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

二、使用示例

1.文件读取示例

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

c 复制代码
#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.结合麦克风演示

c 复制代码
#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 * 2



int 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;
        }

        // 将音频数据传递给 Vosk
        final_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是一个不错的选择,但是如果只是用于语音唤醒之类的,实际上应该有更好的选择。

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

相关推荐
向上的车轮1 小时前
AI音乐创作实战:用Workbuddy定制专属BGM并仿写《Star Sky》
人工智能·ai音乐·workbuddy
宸津-代码粉碎机5 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
做萤石二次开发的哈哈7 小时前
视频解码器怎么对接?解码上墙、电视墙开窗与场景切换的ISAPI接入实战
人工智能·物联网·监控·视频编解码·大屏端·萤石开放平台·蓝海aiot一站式工作台
Leo.yuan7 小时前
2026年本地化Data Agent优质厂商盘点:哪些产品更适合企业生产环境
大数据·数据库·人工智能
长谷深风1117 小时前
Tool与Skill:AI能力设计的分水岭
java·人工智能·ai·大模型·aiagent
科技观察哨7 小时前
六足平台选型与纳米定位系统集成:HEB-640六自由度位移台在半导体光刻对准中的参数边界与国产替代评估
前端·人工智能
云上先途7 小时前
任务智能体可以自动完成哪些类型工作,是不是只能做简单重复操作?
大数据·人工智能
明志数科8 小时前
具身智能数据供给的分层:分布式采集与入厂采集的工程边界分析
人工智能·机器学习·机器人
像风一样自由20208 小时前
41.用FastAPI搭建一个RAG后端需要哪些接口
人工智能·大模型·fastapi·rag·智能体
小蒋观天下8 小时前
两轮车检测AI摄像头——2026行业竞争格局、商业模式与核心痛点
大数据·人工智能·安全·计算机视觉·ai大模型