実現したいこと
Raspberry PiのGPIO(ADC)で録音したPCMのデータをwindowsでflacに変換したいです。
前提
現在のコードで変換自体はできるのですが、何故か早送り?倍速みたいになってしまいます。
自分ではビットレートやサンプルなどの数を合わせているつもりなのですが、何故かうまくいきません。ここを改善したいです。
該当のソースコード
録音側(ラズパイ、MicroPython)のコードです。
Python
1import uos 2import ustruct 3import utime 4from machine import Pin, ADC 5from micropython import const 6import os 7 8filename = "/recording.pcm" 9 10mic_pin = ADC(Pin(26)) 11 12with open(filename, "wb") as f: 13 # サンプリング周波数 14 sample_rate = const(16000) 15 # サンプルあたりのバイト数 16 sample_width = const(2) 17 # チャンネル数 18 num_channels = const(1) 19 # 1秒あたりのサンプル数 20 samples_per_second = sample_rate * num_channels 21 # 1フレームあたりのバイト数 22 bytes_per_frame = sample_width * num_channels 23 # 録音する時間 24 record_time = 3 25 # 録音するサンプル数 26 num_samples = record_time * samples_per_second 27 28 # 録音を開始 29 print("start") 30 for i in range(num_samples): 31 sample = mic_pin.read_u16() 32 sample_data = ustruct.pack("<H", sample) 33 f.write(sample_data) 34 35print("stop") 36f.close() 37 38uos.umount("/") 39print("finish") 40
エンコード側(PC、普通のPython)
Python
1from pydub import AudioSegment 2 3pcm_file = AudioSegment.from_file("recording.pcm", format="raw", frame_rate=16000, channels=1, sample_width=2) 4 5pcm_file.export("recording.flac", format="flac")
試したこと
ビットレートを別のに合わせてみたりしましたが、だめでした。
補足情報(FW/ツールのバージョンなど)
Raspberry PiPico
windows10
MicroPython 1.19.1
Python 3.9.7
追記
can110様が教えていただいた通り、適切なサンプリングレートで録音できていないことがわかりました。
何回か測定してみたところ、3000~11000というとても幅があることになり、困っています。
試しに11000ぐらいでエンコードしてみたところ、たしかに速度は適切でしたが、明らかに音が低くなってしまいました。
プログラミング側で16000Hzに固定、またはその周辺での録音か、16000Hzではなくても普通に録音する方法はありませんか?
マイコンで録音したい、というのは珍しいことではないと思うのですが、普通はどうやって実現しているのでしょうか?
