QAudioRecorder 检测到用户不说话并停止

Posted

技术标签:

【中文标题】QAudioRecorder 检测到用户不说话并停止【英文标题】:QAudioRecorder detect user not speaking and stop 【发布时间】:2016-05-17 06:58:51 【问题描述】:

我想使用QAudioRecorder 录制用户的音频,然后使用音频输出文件将语音转换为文本。我可以成功运行并录制此示例中的音频,http://doc.qt.io/qt-5/qtmultimedia-multimedia-audiorecorder-example.html

但我的问题是,当QAudioRecorder 正在录制音频时,我需要检测用户是否停止说话。所以QAudioRecorder 应该只在用户不说话时停止。

我可以使用QTimerQAudioRecorder 停止固定秒数,如下所示:

void AudioRecorder::toggleRecord()

    if (audioRecorder->state() == QMediaRecorder::StoppedState) 
        audioRecorder->setAudioInput(boxValue(ui->audioDeviceBox).toString());

        QAudioEncoderSettings settings;
        settings.setCodec(boxValue(ui->audioCodecBox).toString());
        settings.setSampleRate(boxValue(ui->sampleRateBox).toInt());
        settings.setBitRate(boxValue(ui->bitrateBox).toInt());
        settings.setChannelCount(boxValue(ui->channelsBox).toInt());
        settings.setQuality(QMultimedia::EncodingQuality(ui->qualitySlider->value()));
        settings.setEncodingMode(ui->constantQualityRadioButton->isChecked() ?
                                 QMultimedia::ConstantQualityEncoding :
                                 QMultimedia::ConstantBitRateEncoding);

        QString container = boxValue(ui->containerBox).toString();

        audioRecorder->setEncodingSettings(settings, QVideoEncoderSettings(), container);
        audioRecorder->record();
        this->recordTimeout();
    
    else 
        this->stopRecording();
    


void AudioRecorder::recordTimeout()

    QTimer* mTimer = new QTimer(this);
    mTimer->setSingleShot(true);
    connect(mTimer, SIGNAL(timeout()), SLOT(stopRecording()));
    mTimer->start(6000);


void AudioRecorder::stopRecording()

    audioRecorder->stop();

但是,当用户不说话时,它应该停止录制,而不是这样。 QAudioProbe 类有这个信号 audioBufferProbed(QAudioBuffer) 这可能有助于检查音频电平,但我不知道如何使用它以及可以使用什么电平来检测用户是否在说话。

【问题讨论】:

【参考方案1】:

一段时间以来,我一直在尝试或多或少地做同样的事情。有一个示例 - https://doc.qt.io/qt-5/qtdatavisualization-audiolevels-example.html 向您展示了如何实现音频电平表,这应该会有所帮助。该示例使用QAudioInput。具体来说,它使用QAudioInput::start(QIODevice * device) 并通过自定义QIODevice 来实现音频电平表。使用QAudioInput 的这种方法的问题在于,一旦您获得了数据,就不容易对其进行编码并将其写入文件,而使用QAudioRecorder 则很简单。

无论如何...如果您想用QAudioRecorder 轻松记录,您的权利QAudioProbe 是您的最佳选择。我调整了 Qt 音频电平表示例以使用 QAudioProbe 而不是 QAudioInput/QIODevice。见-https://gist.github.com/sam-at-github/bf66e84105cc3e23e7113cca5e3b1772。

电平表需要QAudioFormatQAudioRecorder 只为您提供QEncoderSettings 的一个小问题(应该修复代码以使用后者。我不知道为什么两者 @ 987654337@ 和 QAudioFormat 需要存在...)。您只需为您使用的设备获取QAudioDeviceInfo,然后使用QAudioDeviceInfo::preferredFormat()


相关帖子: Qt: API to write raw QAudioInput data to file just like QAudioRecorder

【讨论】:

以上是关于QAudioRecorder 检测到用户不说话并停止的主要内容,如果未能解决你的问题,请参考以下文章

android上的qt5不使用QAudioRecorder录制PCM wav文件

用户说话时如何捕捉语音输入

java sip打电话实现,如何判断用户不说话

减速并停在特定点的物体

“未引发语音假设事件”

让推荐系统会“说话”,达观数据推荐理由设计实践