2

我想用来QAudioRecorder记录用户的音频,然后将音频输出文件用于语音到文本。我可以从这个例子成功地运行和录制音频,http://doc.qt.io/qt-5/qtmultimedia-multimedia-audiorecorder-example.html

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

我可以使用如下方式停止QAudioRecorder固定秒数:QTimer

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),它可能有助于检查音频电平,但我不知道如何使用它以及可以使用什么电平来检测用户是否在说话。

4

1 回答 1

0

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

无论如何...QAudioProbe如果您想用QAudioRecorder. 我改编了 Qt 音频电平表示例来QAudioProbe代替QAudioInput/使用QIODevice。见 - https://gist.github.com/sam-at-github/bf66e84105cc3e23e7113cca5e3b1772

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


相关帖子: Qt:API 将原始 QAudioInput 数据写入文件,就像 QAudioRecorder

于 2017-01-06T12:55:44.253 回答