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

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

Vosk:Vosk是一个开源的语音识别工具,支持中英文及多种语言,具备离线识别能力,且不依赖互联网。
PaddleSpeech:PaddleSpeech是百度的开源语音识别工具,准确率较高,但需要稍微多一点的配置。
本示例将使用 Vosk,它支持多平台,且易于集成到C++项目中,满足离线使用、90%以上准确率、开源等要求。

  1. Vosk资源下载
    首先,下载Vosk的C++库及中英文模型文件:
    如果不想编译库,这里有已经编译好的
    Vosk库: Vosk GitHub仓库
    中英文模型:Vosk 模型下载
    下载对应的库和模型,并确保你的开发环境中已经配置好CMake和Qt开发环境。

  2. 示例代码
    以下是一个完整的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();
}

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

  2. 提示
    确保麦克风采样率为16kHz,以匹配识别模型的采样率。
    运行过程中需要确保模型路径正确,并安装所需的Qt和Vosk依赖库。
    参考资源
    Vosk官方文档和API:https://alphacephei.com/vosk

作者博客:blog.youkuaiyun.com/wwplh5520370 本程序使用讯飞的在线语音听写websocket API实现语音识别,在网络条件良好的前提下,识别速度是很快的。 使用前提:要求python3运行环境!因此请确保您的机器已经安装好python3。 建议python3.7以上的64位版本,一定要64位。不支持python2。 如需32位版本的应用程序或源码,请联系作者微信784765727。 使用步骤: 1、用文本编辑器打开create_url.py文件,修改APISecret和APIKey; 2、打开appid.txt,写入自己的appid; 3、默认ws非安全连接,可切换至wss安全连接,修改create_url.py文件中的url参数,将开头的ws改为wss即可。如果不懂就不要修改了,wss连接比ws要耗时多一点。 4、打开exe即可享受在线语音识别。若提示不支持音频设备,请尝试在左下角音频设备列表重新选择,不报错说明可以使用。 特性: 1、自动更新url:讯飞api要求生成url的时间与请求的时间相差不超过300秒,因此需要自动更新url。 2、断线自动重连: 情况1:每次接收到讯飞返回的识别结果后,客户端会主动断开连接并再次重新连接,否则再次发送语音识别请求无效。 情况2:客户端与服务器超过10秒无数据来往,服务器会主动断开连接。 情况3:建立连接后最多可维持60秒,即使与服务器有数据来往,到时间了服务器也会自动断开连接。 3、按住“录音”按钮录制音频,释放后自动发送至服务器进行识别。 4、“send”按钮发送上一次的录音。 5、“clear”按钮清空界面内容。 6、自动解析服务器返回的结果数据,显示在界面上。 特别说明:识别速度基本上取决于网络环境,网络延迟高,识别速度就慢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值