0

そのサンプルに存在するすべてのフレームで、次のようなオーディオ サンプルの振幅をプロットしています。

sound = AudioSegment.from_mp3("test.mp3")
print(len(sound))
print(len(sound.raw_data))
data = np.fromstring(sound.raw_data, dtype=np.int16)
left, right = data[0::2], data[1::2]
plt.plot(left)

その過程で、サウンド AudioSegment の長さがサウンド raw_data と異なることに気付きました。なぜですか?

また、test.mp3 のデュレーションが長くなると、x 軸の目盛りが数百万になるので、低いサンプル レートでデータをプロットするにはどうすればよいか、つまりデータ配列のサンプル数を減らすにはどうすればよいか疑問に思っていましたか?

これが私の最初の考えです: オーディオ データ配列の最初の 10 または 20 サンプルの平均を計算し、それらを 1 つのポイントとして表して、サンプル数を減らすことができるようにします。ただし、これにより、情報の損失やパフォーマンスの問題が発生する可能性があります。

Pythonにはこれを行う別の方法がありますか??

4

1 に答える 1

0

pydub ではlen(sound)、ミリ秒単位の継続時間です。ここでlen(sound.raw_data)、合計オーディオ データのバイト数になります。

CD 品質のサウンド (44.1kHz、16 ビット、ステレオ) で作業している場合、1 ミリ秒はおよそ 44 サンプル (44100 / 1000) であり、1 サンプルあたり 2 バイト (16 ビット) で、左/右がさらに 2 倍になると予想されます。チャンネル。したがって、ミリ秒あたり約 176 バイトです。

多くのオーディオ エディターで見られるようなプロットを作成するための最も一般的な方法は、オーディオの rms をチャンクで取得することです。

幅 400 ピクセルのプロットが必要な場合は、次のようにします。</p>

from pydub import AudioSegment
sound = AudioSegment.from_file("...")

num_chunks = 400 #px
chunk_size = int(len(sound) / num_chunks #ms))

loudness_over_time = []
for i in range(0, len(sound), chunk_size):
    chunk = sound[i:i+chunk_size]
    loudness_over_time.append(chunk.rms)

注、私はこのコードをテストしていません

于 2016-08-12T13:20:15.007 に答える