2016-05-17 43 views
2

我想用QAudioRecorder來記錄用戶的音頻,然後使用音頻輸出文件進行語音到文本。我可以成功運行並錄製此示例中的音頻http://doc.qt.io/qt-5/qtmultimedia-multimedia-audiorecorder-example.htmlQAudioRecorder檢測用戶不會說話並停止

但我的問題是,我需要檢測用戶是否已經停止講話,而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類有這個信號audioBufferProbed(QAudioBuffer)這可能有助於檢查音頻的水平,但我不知道如何使用它,以及可以使用什麼水平來檢測用戶是否不說話。

回答

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(也許應該修復代碼中使用後者。我不知道爲什麼QEncoderSettingsQAudioFormat有存在的必要......)。你只需要爲你使用的設備獲取QAudioDeviceInfo,然後使用QAudioDeviceInfo::preferredFormat()


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