2016-05-17 13 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クラスにはこの信号がありますが、これはオーディオのレベルを確認するのに役立ちますが、使用方法がわからず、ユーザーが話していない場合にどのレベルを検出できるのかわかりません。

答えて

0

私はもうしばらく同じことをやろうとしてきました。たとえば、オーディオレベルメーターの実装方法を示す例があります(https://doc.qt.io/qt-5/qtdatavisualization-audiolevels-example.html)。この例ではQAudioInputが使用されています。具体的には、QAudioInput::start(QIODevice * device)を使用し、オーディオレベルメーターを実装するためにカスタムQIODeviceを渡します。 QAudioInputを使用したこのアプローチの問題は、データを取得した後で、それをエンコードしてファイルに書き出すことは容易ではありません。QAudioRecorderのように単純です。

とにかく... QAudioProbeは、QAudioRecorderで簡単な方法を記録したい場合は、あなたの最善の策です。私はQAudioInput/QIODeviceの代わりにQAudioProbeで動作するQtオーディオレベルメーターの例を採用しました。 -https://gist.github.com/sam-at-github/bf66e84105cc3e23e7113cca5e3b1772を参照してください。レベルメーターがQAudioFormatしかしQAudioRecorderのみQEncoderSettings(おそらく後者を使用するようにコードを修正する必要があります。QEncoderSettingsQAudioFormatの両方が存在する必要があり、なぜ私は知らない...)を提供しますが必要な

一つの小さな問題。使用するデバイスのQAudioDeviceInfoを取得してから、QAudioDeviceInfo::preferredFormat()を使用してください。


Relaedポスト:Qt: API to write raw QAudioInput data to file just like QAudioRecorder

関連する問題