Linuxでマイクのサンプルレートを16000に変更するにはどうすればよいですか?

Jan 06 2021

現在、マイクオーディオを使用しているときにラズベリーパイでDeepspeechを使用しようとしているプロジェクトに取り組んでいますが、無効なサンプルレートエラーが発生し続けます。pyAudioを使用して、モデルが必要とするサンプルレート(16000)を使用するストリームを作成しますが、使用しているマイクのサンプルレートは44100です。pythonスクリプトを実行すると、レート変換は行われず、マイクのサンプルレートと期待値モデルのサンプルレートは、無効なサンプルレートエラーを生成します。

マイク情報は、pyaudioによって次のようにリストされます。

{'index': 1, 'structVersion': 2, 'name': 'Logitech USB Microphone: Audio (hw:1,0)', 'hostApi': 0, 'maxInputChannels': 1, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.008684807256235827, 'defaultLowOutputLatency': -1.0, 'defaultHighInputLatency': 0.034829931972789115, 'defaultHighOutputLatency': -1.0, 'defaultSampleRate': 44100.0}

私が最初に試したのは、pyAudioストリームのサンプルレートを44100に設定し、そのモデルにフィードすることでした。しかし、テストした後、要求された16000とは異なるレートを取得すると、モデルがうまく機能しないことがわかりました。

私はマイクの変更率を16000にする方法、またはPythonスクリプトで使用するときに少なくともその率を16000に変換する方法を見つけようとしていますが、役に立ちません。

私が試した最新のことは、レートを変更するために.asoundrcファイルを変更することですが、このファイル内でマイクのレートを16000に変更できるかどうかはわかりません。現在、ファイルは次のようになっています。

pcm.!default {
        type asymd
        playback.pcm
        {
                type plug
                slave.pcm "dmix"
        }
        capture.pcm
        {
                type plug
                slave.pcm "usb"
        }
}

ctl.!default {
        type hw
        card 0
}

pcm.usb {
        type hw
        card 1
        device 0
        rate 16000
} 

私が作成したPythonコードは、Windowsで機能します。これは、Windowsが入力のレートをコードのサンプルレートに変換するためだと思います。しかし、Linuxはこれを行っていないようです。

tldr; マイクレートは44100ですが、使用するには16000に変更する必要があります。Linuxでこれをどのように行いますか?

編集1:

私は次のようにpyAudioストリームを作成します:

self.paStream = self.pa.open(rate = self.model.sampleRate(), channels = 1, format= pyaudio.paInt16, input=True, input_device_index = 1, frames_per_buffer= self.model.beamWidth())

モデルのレートとモデルのビーム幅、およびマイクのチャンネル数とマイクのインデックスを使用します。

次のオーディオフレームを取得し、モデル用に作成したストリームで使用するために適切にフォーマットします。これを行います。

def __get_next_audio_frame__(self):
    audio_frame = self.paStream.read(self.model.beamWidth(), exception_on_overflow= False)  
    audio_frame = struct.unpack_from("h" * self.model.beamWidth(), audio_frame)     
    return audio_frame

exception_on_overflow = False入力レート44100でモデルをテストするために使用されましたが、これをFalseに設定しないと、現在処理しているのと同じエラーが発生します。model.beamWidthモデルが期待するチャンクの量の値を保持する変数です。次に、その量のチャンクを読み取り、モデルのストリームにフィードする前に再フォーマットします。これは次のように起こります:

modelStream.feedAudioContent(self.__get_next_audio_frame__())

回答

N.T.AvH Jan 09 2021 at 23:47

それで、もう少しテストした後、私はパルスの設定ファイルを編集することになりました。このファイルでは、エントリのコメントを解除して、デフォルトまたは代替のサンプリングレートを編集できます。48000から16000までの代替サンプリングレートの編集は、私の問題を解決することができたものです。

ファイルは次の場所にあります:/etc/pulse/daemon.conf 。を使用して、Raspberianでこのファイルを開いて編集できますsudo vi daemon.conf。次に、を; alternate-sample-rate = 48000削除しての行のコメントを解除し、;の値を48000に変更する必要があります16000。ファイルを保存してvimを終了します。次に、を使用pulseaudio -kしてPulseaudioを再起動し、変更されたファイルが実行されることを確認します。

vimとLinuxに慣れていない場合は、サンプルレートを変更するプロセスに関するより詳細なガイドがここにあります。