Numpyの2D配列から「心拍数モニター」効果を作成し、配列の値をトーンに反映させたい。
scipy.io.wavfile
の- write
function を使用してwavファイルを作成し、それを自由に再生できます。配列は整数である必要があることに注意してください。そのため、浮動小数点数がある場合は、適切にスケーリングする必要があります。
import numpy as np
from scipy.io.wavfile import write
data = np.random.uniform(-1,1,44100) # 44100 random samples between -1 and 1
scaled = np.int16(data/np.max(np.abs(data)) * 32767)
write('test.wav', 44100, scaled)
Python=実際にオーディオを再生したい場合) このページ は、いくつかのパッケージ/モジュールの概要を提供します。
2016年にここに来る人々にとっては、scikits.audiolabはもう機能していないようです。サウンドデバイスを使用して解決策を得ることができました。
import numpy as np
import sounddevice as sd
fs = 44100
data = np.random.uniform(-1, 1, fs)
sd.play(data, fs)
さらに、 scikits.audiolab を試すこともできます。ファイルIOおよび配列を「再生」する機能を備えています。配列は整数である必要はありません。
import numpy as np
import scikits.audiolab
data = np.random.uniform(-1,1,44100)
# write array to file:
scikits.audiolab.wavwrite(data, 'test.wav', fs=44100, enc='pcm16')
# play the array:
scikits.audiolab.play(data, fs=44100)
Jupyterを使用している場合、最適なオプションは次のとおりです。
from IPython.display import Audio
Audio(numpy.sin(numpy.linspace(0, 3000, 20000)), rate=20000)
scikit.audiolabs
の使用に問題があったため、このタスクの別のオプションを探しました。 sounddevice を思いつきましたが、これはもっと最新のようです。 Python 3。
必要なことを実行する簡単な方法は次のとおりです。
import numpy as np
import sounddevice as sd
sd.default.samplerate = 44100
time = 2.0
frequency = 440
# Generate time of samples between 0 and two seconds
samples = np.arange(44100 * time) / 44100.0
# Recall that a sinusoidal wave of frequency f has formula w(t) = A*sin(2*pi*f*t)
wave = 10000 * np.sin(2 * np.pi * frequency * samples)
# Convert it to wav format (16 bits)
wav_wave = np.array(wave, dtype=np.int16)
sd.play(wav_wave, blocking=True)
PyGameにはモジュールpygame.sndarray
これは、numpyデータをオーディオとして再生できます。 PyGameは立ち上げて実行するのが難しいため、他の答えはおそらくより良いでしょう。再び、scipyとnumpyにはそれぞれの困難が伴うので、PyGameをミックスに追加することは大きなステップではないかもしれません。
別の現代的で便利な解決策は、 pysoundfile を使用することです。これは、読み取りと書き込みが可能です 幅広い音声ファイル形式 :
import numpy as np
import soundfile as sf
data = np.random.uniform(-1, 1, 44100)
sf.write('new_file.wav', data, 44100)