音源再生での「間延び」と対策
問題発生
変なことが起こりました。(前回時間切れになった理由です)
次の「比較記事」
のなかでは、
ファイル処理pydub、再生sounddevice
import time
import sounddevice as sd
from pydub import AudioSegment
start_time = time.time()
# 処理をここに
audio = AudioSegment.from_file("test.mp3")
audio_data = audio.get_array_of_samples()
sr = audio.frame_rate
sd.play(audio_data, samplerate=sr)
sd.wait()
end_time = time.time()
print(f"{end_time-start_time:.3f}秒")
と、このコードで問題なかった(「good morning」と発声する1秒ちょっとのファイルの場合)のです。
ところが、長さ113秒の「甘茶の音楽工房」様の「残業戦士」
の音楽ファイルを入れて再生させたら、間延びした再生になって、再生完了までは「230.448秒」になってしまうという大問題が発生。
間延びするということは、サンプルレートの処理がちゃんとできていないということだと推測。
ファイル処理librosa、再生sounddevice
import time
import librosa
import sounddevice as sd
start_time = time.time()
# 処理をここに
y, sr = librosa.load("test.mp3")
sd.play(y, sr)
sd.wait()
end_time = time.time()
print(f"{end_time-start_time:.3f}秒")
比較のため実行したこちらのコードでは通常スピードで再生される。124.049秒
なんで、「good morning」のファイルは問題ないのに、「残業戦士」は違いが出るのか?あー、ステレオかどうか、とかその辺の問題かな。(まあ、いざとなったらpydubでのaudio_data、srとlibrosaでの y、srの中身を比較するか?)
Copilot先生を呼ぶ
以前なら、ここでお手上げ、放置だったと思います。いまはCopilot先生を呼ぶという手段がある。
このまま再生したら、正常に再生されました。113.479秒。
ただし、最初の指摘の、浮動小数点スケールは関係ない気がする。削れるところは削ってみます。
import time
import numpy as np
import sounddevice as sd
from pydub import AudioSegment
start_time = time.time()
# 音声ファイルを読み込む
audio = AudioSegment.from_file("test2.mp3")
audio_data = np.array(audio.get_array_of_samples())
# ステレオデータの場合、2次元配列に変換する
if audio.channels == 2:
audio_data = audio_data.reshape((-1, 2))
print(audio.channels)
sr = audio.frame_rate
# 音声の再生
sd.play(audio_data, samplerate=sr)
sd.wait()
end_time = time.time()
print(f"{end_time - start_time:.3f}秒")
これで、正常再生,audio.channelsも音楽ファイルでは2、語学用の(gttsが吐き出した音声データ)では1となっており、違いが出た理由への疑問が解決しました。