独学でピアノの練習(子犬のワルツ)をしているのですが、
お手本を聴いても、テンポが速すぎて参考にならないので困っていました。
そこで、Pythonでmp3ファイルを倍速再生する方法を調べました。
以下使用した環境・ライブラリです。
python(anaconda):3.7.7
pyaudio:0.2.11
pydub:0.23.1
スポンサーリンク
Pythonコード
ほぼ以下のサイト様のPyaudioを使うやり方を採用しています。
ただ、記事が少し古いので1部コードを変更しています。音楽の波形データ(byte)を時間軸上で伸縮させることで倍速再生できるようです。
speed_nuとmp3_pathがコマンド引数です。
python test-speed.py --speed_nu=<何倍速にするか(0.5など小数点でもOK)> --mp3_path=<mp3ファイルのパス>
という感じで数字とファイルパスを指定してください。Pythonのファイル名は「test-speed.py」になっていますが、自由に変更可です。
#!/usr/bin/env python
"""test-speed.
Usage:
test-speed.py
--speed_nu=<speed_nu>
--mp3_path=<mp3_path>
test-speed.py -h | --help
Options:
-h --help show this screen and exit.
"""
#必要なものを宣言
from docopt import docopt
import numpy as np
import pyaudio
import pydub
from pydub import AudioSegment
import wave
#スピード調節
def changePlaySpeed(inp,rate):
outp = []
for i in range(int(len(inp) / rate)):
outp.append(inp[int(i * float(rate))])
return np.array(outp)
#mp3ファイルをwavファイルに変換
def main(mp3_path, speed_nu):
sound = pydub.AudioSegment.from_mp3(mp3_path)
output_file = mp3_path + '_wav_file.wav'
sound.export(output_file, format="wav")
wf = wave.open(output_file, 'rb')
p = pyaudio.PyAudio()
#音楽再生の設定
stream = p.open(format =
p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True,
frames_per_buffer = chunk)
data = wf.readframes(chunk)
while data != '':
stream.write(data)
data = wf.readframes(chunk)
data = np.frombuffer(data,dtype = "int16")
data = changePlaySpeed(data, speed_nu)
data = np.int16(data).tostring()
stream.close()
p.terminate()
if __name__ == '__main__':
chunk = 1024
args = docopt(__doc__)
#mp3ファイルを設定
mp3_path = args['--mp3_path']
#np.floatにしないと0.5倍速などができなくなる
speed_nu = np.float(args['--speed_nu'])
main(mp3_path, speed_nu)
mp3ファイル(例えば、子犬のワルツ)をポケットサウンド/効果音素材
から入手して、実行してみましたが問題なく倍速再生できました。