Tex, python, illusrator, VPSの学生ノート

latotex-blog

Python

Pythonでmp3ファイルを倍速再生する!

投稿日:2020年9月1日 更新日:







独学でピアノの練習(子犬のワルツ)をしているのですが、
お手本を聴いても、テンポが速すぎて参考にならないので困っていました。
そこで、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ファイル(例えば、子犬のワルツ)をポケットサウンド/効果音素材
から入手して、実行してみましたが問題なく倍速再生できました。


-Python
-, ,

Copyright© latotex-blog , 2020 All Rights Reserved Powered by STINGER.