Python 実践 データ加工/可視化 100本ノック」を購入したので、
一通りやっているところです。今日はノック79 ノック80を行います。
資料は以下から入手できます。
Python実践 データ加工/可視化 100本ノック|サポート|秀和システム
ノック79 : 音の高さや長さを変えてみよう
GoogleColabだとimport IPython.display as dispを使用して音声データを再生していますが、Vscodeだと動作しなかったので、playsoundを使って確認しました。
さらに、「音声.mp3」のようにファイル名に日本語があるとエンコードのエラーが出たので、音声.mp3をコピーしてonsei.mp3に名を変更して使用しています。
さらにplaysoundだと変換したデータをそのまま聞けないので、soundfileのwriteメソッドを利用してwavファイルに置き換えて実行してみました。
import librosa
import numpy as np
from playsound import playsound
audio1,sr1 = librosa.load('data/音声.mp3' ,sr=None,offset=0,duration=1)
audio2,sr2 = librosa.load('data/携帯電話着信音.mp3',sr=None,offset=0,duration=1)
print(audio1.shape)
playsound('data/onsei.mp3')
audio1_pitch=librosa.effects.pitch_shift(audio1,sr1,10)
print(audio1_pitch.shape)
import soundfile
soundfile.write('data/onsei_mod.wav',audio1_pitch,sr1)
playsound('data/onsei_mod.wav')
実行結果
ちょっと声が高くなって聞こえました。
次に低い声に変換してみます。
audio1_pitch=librosa.effects.pitch_shift(audio1,sr1,-5)
print(audio1_pitch.shape)
soundfile.write('data/onsei_mod2.wav',audio1_pitch,sr1)
playsound('data/onsei_mod2.wav')
実行結果
低いです。
次に電話の着信音の時間の間延びを行ってみます。「携帯電話着信音.mp3」をtest.mp3という名にリネームして使用してみました。
audio2_time=librosa.effects.time_stretch(audio2,0.5)
print(audio2_time.shape)
soundfile.write('data/test_mod.wav',audio2_time,sr2)
playsound('data/test.mp3')
playsound('data/test_mod.wav')
実行結果
間延びしました。
元データより短い間隔で着信を鳴らしたい場合は、引数を1より大きい値に設定します。
audio2_time=librosa.effects.time_stretch(audio2,2)
print(audio2_time.shape)
soundfile.write('data/test_mod2.wav',audio2_time,sr2)
playsound('data/test.mp3')
playsound('data/test_mod2.wav')
実行結果
短いです。
wavファイルをmp3に変換したい場合は以下のように行います。
ffmpegがインストールされていない場合はpip install ffmpeg_pythonを実行します。
m_data = ffmpeg.input("data/test_mod.wav")
# 出力
o_data = ffmpeg.output(m_data, "data/test_mod.mp3")
# 実行
ノック80 : 音データを保存しよう
音データの保存はsoundfileのwriteメソッドで行います。
生成されるファイルの拡張子はwav形式です。
import soundfile
soundfile.write('data/onsei_mod.wav',audio1_pitch,sr1)