Qt实现高准确率的语音识别

 更新时间:2024年11月08日 16:02:46   作者:我喜欢就喜欢  
Vosk是一个开源的语音识别工具,支持中英文及多种语言,具备离线识别能力,且不依赖互联网,本文就来聊聊如何使用Vosk API在C++中进行中英文识别吧

1.选择语音识别引擎

开源语音识别项目中,以下两款工具可以用于支持中英文识别,并且与Qt兼容:

Vosk:Vosk是一个开源的语音识别工具,支持中英文及多种语言,具备离线识别能力,且不依赖互联网。

PaddleSpeech:PaddleSpeech是百度的开源语音识别工具,准确率较高,但需要稍微多一点的配置。

本示例将使用 Vosk,它支持多平台,且易于集成到C++项目中,满足离线使用、90%以上准确率、开源等要求。

2.Vosk资源下载

首先,下载Vosk的C++库及中英文模型文件:https://gitcode.com/gh_mirrors/vo/vosk-api/overview

Vosk库: Vosk GitHub仓库

中英文模型:Vosk 模型下载

下载对应的库和模型,并确保你的开发环境中已经配置好CMake和Qt开发环境。

3.示例代码

以下是一个完整的Qt项目代码示例,展示如何使用Vosk API在C++中进行中英文识别。假设你已经下载并解压了模型文件。

#include <QCoreApplication>
#include <QAudioInput>
#include <QBuffer>
#include <QFile>
#include <vosk_api.h>
#include <iostream>

class SpeechRecognizer : public QObject {
    Q_OBJECT
public:
    SpeechRecognizer(const QString &modelPath, QObject *parent = nullptr)
        : QObject(parent) {
        model = vosk_model_new(modelPath.toStdString().c_str());
        recognizer = vosk_recognizer_new(model, 16000.0);
    }

    ~SpeechRecognizer() {
        vosk_recognizer_free(recognizer);
        vosk_model_free(model);
    }

    void startRecognition() {
        QAudioFormat format;
        format.setSampleRate(16000);
        format.setChannelCount(1);
        format.setSampleSize(16);
        format.setCodec("audio/pcm");
        format.setByteOrder(QAudioFormat::LittleEndian);
        format.setSampleType(QAudioFormat::SignedInt);

        audioInput = new QAudioInput(format, this);
        audioBuffer.open(QIODevice::WriteOnly | QIODevice::Truncate);
        audioInput->start(&audioBuffer);

        connect(audioInput, &QAudioInput::stateChanged, this, &SpeechRecognizer::onStateChanged);
    }

private slots:
    void onStateChanged(QAudio::State state) {
        if (state == QAudio::IdleState) {
            audioInput->stop();
            audioBuffer.close();
            processAudio();
        }
    }

    void processAudio() {
        QByteArray audioData = audioBuffer.buffer();
        int length = audioData.size();
        const char *data = audioData.data();

        if (vosk_recognizer_accept_waveform(recognizer, data, length)) {
            std::cout << vosk_recognizer_result(recognizer) << std::endl;
        } else {
            std::cout << vosk_recognizer_partial_result(recognizer) << std::endl;
        }
    }

private:
    VoskModel *model;
    VoskRecognizer *recognizer;
    QAudioInput *audioInput;
    QBuffer audioBuffer;
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QString modelPath = "/path/to/vosk-model"; // 将此路径替换为实际模型路径
    SpeechRecognizer recognizer(modelPath);
    recognizer.startRecognition();

    return app.exec();
}

4.编译与运行

将vosk_api.h和vosk库文件添加到项目中,并在CMakeLists.txt中配置vosk库路径。编译后运行该程序,即可开始录音和实时中英文语音识别。

5.提示

确保麦克风采样率为16kHz,以匹配识别模型的采样率。

运行过程中需要确保模型路径正确,并安装所需的Qt和Vosk依赖库。

参考资源

Vosk官方文档和API:https://alphacephei.com/vosk

到此这篇关于Qt实现高准确率的语音识别的文章就介绍到这了,更多相关Qt语音识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++深度优先搜索的实现方法

    C++深度优先搜索的实现方法

    这篇文章主要介绍了C++深度优先搜索的实现方法,是数据结构中非常重要的一种算法,需要的朋友可以参考下
    2014-08-08
  • C语言内存函数的实现示例

    C语言内存函数的实现示例

    本文主要介绍了C语言内存函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • C++ 内联函数详解

    C++ 内联函数详解

    内联函数是c++为了提高程序的运行速度做的改进,本片文章详细介绍了C++ 的内联函数,本文就来详细的介绍一下,感兴趣的朋友可以了解一下
    2021-11-11
  • C++递归与分治算法原理示例详解

    C++递归与分治算法原理示例详解

    这篇文章主要为大家介绍了C++递归与分治算法的策略原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • 详解C++ 重载运算符和重载函数

    详解C++ 重载运算符和重载函数

    这篇文章主要介绍了C++ 重载运算符和重载函数的的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C++实现LeetCode(17.电话号码的字母组合)

    C++实现LeetCode(17.电话号码的字母组合)

    这篇文章主要介绍了C++实现LeetCode(17.电话号码的字母组合),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++输入一个字符串,把其中的字符按照逆序输出的两种方法解析

    C++输入一个字符串,把其中的字符按照逆序输出的两种方法解析

    以下是对C++中输入一个字符串,把其中的字符按照逆序输出的两种方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • C语言报错:Buffer Overflow的原因和解决办法

    C语言报错:Buffer Overflow的原因和解决办法

    Buffer Overflow是C语言中常见且危险的内存错误之一,它通常在程序试图向缓冲区(如数组或内存块)写入超过其容量的数据时发生,本文将详细介绍Buffer Overflow的产生原因,提供多种解决方案,需要的朋友可以参考下
    2024-07-07
  • C语言实现斐波那契数列(非递归)的实例讲解

    C语言实现斐波那契数列(非递归)的实例讲解

    下面小编就为大家带来一篇C语言实现斐波那契数列(非递归)的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • C/C++中的 Qt StandardItemModel 数据模型应用解析

    C/C++中的 Qt StandardItemModel 数据模型应用解析

    QStandardItemModel 是标准的以项数据为单位的基于M/V模型的一种标准数据管理方式,本文给大家介绍C/C++中的 Qt StandardItemModel 数据模型应用解析,感兴趣的朋友跟随小编一起看看吧
    2021-12-12

最新评论