QAudioRecorder 检测到用户没有说话并停止
QAudioRecorder detect user not speaking and stop
我想使用 QAudioRecorder
录制用户的音频,然后将音频输出文件用于语音到文本。我可以成功 运行 并录制此示例中的音频,http://doc.qt.io/qt-5/qtmultimedia-multimedia-audiorecorder-example.html。
但我的问题是,我需要检测用户是否在 QAudioRecorder
正在录制音频时停止说话。所以 QAudioRecorder
应该只在用户不说话时停止。
我可以使用 QTimer
停止 QAudioRecorder
固定秒数,如下所示:
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
class 有这个信号 audioBufferProbed(QAudioBuffer)
这可能有助于检查音频级别,但我不知道如何使用它以及可以使用什么级别来检测用户是否没有正在发言。
一段时间以来,我一直在尝试做或多或少相同的事情。有一个示例 - 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.
水平仪需要 QAudioFormat
但 QAudioRecorder
只为您提供一个 QEncoderSettings
的一个小问题(可能应该修复代码以使用后者。我不知道为什么 QEncoderSettings
和 QAudioFormat
都需要存在...)。您只需为您使用的设备获取 QAudioDeviceInfo
然后使用 QAudioDeviceInfo::preferredFormat()
.
相关 Post: Qt: API to write raw QAudioInput data to file just like QAudioRecorder
我想使用 QAudioRecorder
录制用户的音频,然后将音频输出文件用于语音到文本。我可以成功 运行 并录制此示例中的音频,http://doc.qt.io/qt-5/qtmultimedia-multimedia-audiorecorder-example.html。
但我的问题是,我需要检测用户是否在 QAudioRecorder
正在录制音频时停止说话。所以 QAudioRecorder
应该只在用户不说话时停止。
我可以使用 QTimer
停止 QAudioRecorder
固定秒数,如下所示:
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
class 有这个信号 audioBufferProbed(QAudioBuffer)
这可能有助于检查音频级别,但我不知道如何使用它以及可以使用什么级别来检测用户是否没有正在发言。
一段时间以来,我一直在尝试做或多或少相同的事情。有一个示例 - 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.
水平仪需要 QAudioFormat
但 QAudioRecorder
只为您提供一个 QEncoderSettings
的一个小问题(可能应该修复代码以使用后者。我不知道为什么 QEncoderSettings
和 QAudioFormat
都需要存在...)。您只需为您使用的设备获取 QAudioDeviceInfo
然后使用 QAudioDeviceInfo::preferredFormat()
.
相关 Post: Qt: API to write raw QAudioInput data to file just like QAudioRecorder