9

これは、スタックに関する私の最初の投稿です。これまでのところ、このサイトは非常に役に立ちましたが、私は初心者であり、Python でのオーディオのピッチシフトに関連する問題について明確な説明が必要です。現在のモジュールがインストールされています: numpy、scipy、pygame、および scikits の「samplerate」API。

私の目標は、ステレオ ファイルを取得し、できるだけ少ない手順で異なるピッチで再生することです。現在、pygame.sndarray を使用してファイルを配列にロードし、scikits.samplerate.resample を使用してサンプルレート変換を適用し、pygame を使用して再生用に出力をサウンド オブジェクトに戻します。問題は、スピーカーからガベージ オーディオが出力されることです。確かに、いくつかの手順が欠けています (数学とオーディオについて何も知らないことに加えて)。

ありがとう。

import time, numpy, pygame.mixer, pygame.sndarray
from scikits.samplerate import resample

pygame.mixer.init(44100,-16,2,4096)

# choose a file and make a sound object
sound_file = "tone.wav"
sound = pygame.mixer.Sound(sound_file)

# load the sound into an array
snd_array = pygame.sndarray.array(sound)

# resample. args: (target array, ratio, mode), outputs ratio * target array.
# this outputs a bunch of garbage and I don't know why.
snd_resample = resample(snd_array, 1.5, "sinc_fastest")

# take the resampled array, make it an object and stop playing after 2 seconds.
snd_out = pygame.sndarray.make_sound(snd_resample)
snd_out.play()
time.sleep(2)
4

4 に答える 4

11

あなたの問題は、pygameが配列で動作することですが、配列を返すためnumpy.int16の呼び出しです:resamplenumpy.float32

>>> snd_array.dtype
dtype('int16')
>>> snd_resample.dtype
dtype('float32')

次を使用してresample結果を変換できます。numpy.int16astype

>>> snd_resample = resample(snd_array, 1.5, "sinc_fastest").astype(snd_array.dtype)

この変更により、Python スクリプトはtone.wavファイルをより低いピッチと低速で適切に再生します。

于 2011-12-21T22:32:42.683 に答える
3

あなたの最善の策は、おそらく python audiere を使用することです。

ここにリンクがあります。私はそれを使って同じようなことをしました。とても簡単です。すべてのドキュメントを読むだけです。

http://audiere.sourceforge.net/home.php

于 2011-12-15T18:14:39.187 に答える
0

scikits.samplerate.resampleドキュメントから:

入力のランクが1の場合、すべてのデータが使用され、モノラル信号からのものであると見なされます。ランクが2の場合、数値列はチャネル数と見なされます。

resampleだから私はあなたがする必要があるのはそれが期待するフォーマットでステレオデータを渡すためにこのようなものだと思います:

snd_array = snd_array.reshape((-1,2))

snd_resample = resample(snd_array, 1.5, "sinc_fastest")

snd_resample = snd_resample.reshape(-1) # Flatten it out again
于 2011-12-15T20:46:31.077 に答える
0

ほとんどの場合、scikits.samplerate.resampleは、オーディオが16ビットステレオ以外の形式であると「考えている」ものです。アレイ内の適切なオーディオ形式を選択する場所については、scikits.samplerateのドキュメントを確認してください。16ビットオーディオをリサンプリングした場合、8ビットガベージとして処理されます。

于 2011-12-14T12:45:42.977 に答える