

マイクで入力した音声をリアルタイムで特徴量抽出したいです。

pyaudioを用いてストリーミング入力しようとしていますが、HTKやtorchaudioなどのライブラリではwavファイルからloadしたもので抽出できるようになっています。

wavファイルを経由することなく特徴量抽出する方法はないでしょうか。

[code]

    import pyaudio
    P = pyaudio.PyAudio()
    RATE = 44100
    CHUNK = 1024
    stream = P.open(format=pyaudio.paInt16, channels=1, rate=RATE, frames_per_buffer=CHUNK, input=True, output=False)
    while stream.is_active():
        input = stream.read(CHUNK)
        # filterbankなどの処理
    
[/code]


CC BY-SA 4.0
2020-02-17T11:07:05.087
63118
2022-07-29T04:32:13.577
2020-02-17T15:03:39.210
32986
37867
question
python
マイクで入力した音声をリアルタイムで特徴量抽出したい


torchaudio v0.12 で追加された
[torchaudio.io.StreamReader](https://pytorch.org/audio/0.12.0/io.html#streamreader)
を使うと、マイクからの入力を直接 torch.Tensor で読み込むことができます。対応する FFmpeg ライブラリが必要になります。(conda
を使っている場合は conda install 'ffmpeg<4.4' でインストールできます。)

参照：  
<https://pytorch.org/audio/stable/tutorials/device_asr.html>

以下は macOS の場合の例です。

[code]

    # StreamReader の初期化
    streamer = torchaudio.io.StreamReader(
        src=":default",  # デフォルトのオーディオ入力デバイスを使用。
        format = "avfoundation",  # デバイスドライバー
    )
    
    # オーディオの入力を設定
    streamer.add_basic_audio_stream(
        frames_per_chunk=8000,  # 8000 フレームを一度に取得
        sample_rate=8000,  # 8k Hz にリサンプリング
    )
    
    # ストリーム
    #
    # timeout はオーディオデバイスが十分なデータを生成するまでの許容待ち時間で、
    # -1 はデータが整うまで待機します。単位:秒
    #
    # backoff は待機許容時間内でリトライする間隔を指定します。単位:秒
    for (audio_chunk, ) in streamer.stream(timeout=-1, backoff=1.0):
        # audio_chunk は 8000 フレームの torch.Tensor
        pass
    
[/code]

`format` 引数に渡すデバイスドライバーは OS と FFmpeg ライブラリの種類によって異なりますが、 macOS では
`"avfoundation"`, Windows では `"dshow"` が標準的です。

各ドライバーが扱えるデバイスの種類は `ffmpeg` コマンドで確認できます。

[code]

    $ ffmpeg -f avfoundation -list_devices true -i dummy
    ...
    [AVFoundation indev @ 0x126e049d0] AVFoundation video devices:
    [AVFoundation indev @ 0x126e049d0] [0] FaceTime HD Camera
    [AVFoundation indev @ 0x126e049d0] [1] Capture screen 0
    [AVFoundation indev @ 0x126e049d0] AVFoundation audio devices:
    [AVFoundation indev @ 0x126e049d0] [0] ZoomAudioDevice
    [AVFoundation indev @ 0x126e049d0] [1] MacBook Pro Microphone
    
[/code]

マイクを使ったデータの取得はタイミングが重要なので、サブプロセスを立ち上げてその中でストリーミングの for ループを回し続けると良いかと思います。


CC BY-SA 4.0
2022-07-29T04:12:00.193
90266
2022-07-29T04:32:13.577
2022-07-29T04:32:13.577
3060
873
63118
answer