見出し画像

音源再生での「間延び」と対策


問題発生

変なことが起こりました。(前回時間切れになった理由です)
次の「比較記事」

のなかでは、

ファイル処理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}秒")

1.644秒、1.418秒、1.422秒。おや、pydubはlibrosaと違って速いんだな。

と、このコードで問題なかった(「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となっており、違いが出た理由への疑問が解決しました。

いいなと思ったら応援しよう!