概要
Apple製品ユーザーで日頃からよくApple Musicを聴いているのですが、歌っている部分に合わせて歌詞が一緒に流れるようになっているのがどういう仕組みなのだろうと気になったので調べてみました
仕組みの理解と推測
いろいろ調べてみると、音声ファイルとは別に歌詞データのファイルも必要そうでした
音声ファイルはMP3,WAV,AAC,m4aなどいろいろ聞いたことがあったのですが、歌詞データのファイルについては全く知見がありませんでした
歌詞データのファイルとは
LyRiCsとは、音楽と歌詞を同期させるファイルフォーマット。LyRiCSの略としてLRCと呼ばれることがある。拡張子は「.lrc」。
ファイルの拡張子というのは多すぎていろんなものがあります
この拡張子はウォークマンなどで使われていたものだそうです、懐かしいですね
ファイルの形式としては以下のようになります
また、同じ歌詞については表示時間を重ねて書くことでも表現することができるそうです
[mm:ss.xx]1行目の歌詞
[mm:ss.xx]2行目の歌詞
...
[mm:ss.xx]最終行の歌詞
# 1行目の歌詞が2回歌われる場合
[mm:ss.xx][mm:ss.xx]1行目の歌詞
ということで、MP3などの音声ファイルと歌詞データのlrcを組み合わせて曲の再生時にダウンロードするような形でApple Musicのような歌詞が表示できているのかなと推測しています
(アプリ側の実装は残念ながら深い知識がなく勉強中のため、説明はしません、、)
LRCファイルを作ってみる
過去に書いた記事で動画データ、音声データを文字起こしするみたいな記事を作成していました
そこで作成したデータはLRCの形式に沿っていなかったのですが、文字起こしのコード内で形式に沿うように処理を加えてみます
import math
import whisper
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
model = whisper.load_model("medium")
result = model.transcribe("文字起こし対象ファイルの置き場")
for segment in result["segments"]:
if segment['start'] >= 60:
start_minutes = math.floor(segment['start'] / 60)
start_seconds = segment['start'] % 60
formatted_start_time = f"{start_minutes:02}:{start_seconds:05.2f}"
else:
formatted_start_time = f"{00:02}:{segment['start']:05.2f}"
print(f"[{formatted_start_time}]{segment['text']}")
1分未満のものを基準に分岐を立てております
こうすることで、LRC形式に沿ったコードにすることができました
# 出力結果
[00:00.00]【歌】
[00:17.00]必ず手に入れたいものは 誰にも知られたかない
[00:26.00]100ある甘そうな話なら 一度は触れてみたいさ
おわりに
ということで、ふと使っていて疑問に思ったところの解消ができました
世の中にはファイル拡張子が溢れすぎていて、網羅するのは不可能ではありますが、便利なものなので疑問に思ったら調べるということを繰り返していきたいところです