10/15(火)-10/19(土) 岐阜県(南濃温泉「水晶の湯」)で自動運転車の実証実験を行います☆彡

31-1. ウマ娘の声をフーリエ変換して比較してみた(①準備編)

やること

こんにちは、生粋のウマ娘ファンです|・ω・)ノ

2021年に公開した「画像のフーリエ変換」の記事がロングセラーになっています。とても分かりやすい記事です(感嘆)

で本題なのですが、Youtubeにウマ娘がウマ娘をモノマネしている動画がありました。ゴールドシップ(以下ゴルシ)がメジロマックイーンなど他のウマ娘たちのモノマネを行っています。このゴルシのモノマネが非常に似ていて、コメント欄でも賞賛されています。

【ウマ娘】ゴールドシップモノマネ比較してみたら似すぎてwww

そこで、ゴルシのモノマネが本物とどのくらい似ているのか定量的に評価したいと思いました。ここではそれぞれの音声データをフーリエ変換でスペクトログラムにしてみます。

ちなみにウマ娘は競走馬を美少女に擬人化させた作品です。ゴルシは見た目は美人ですが実は話すと面白いキャラクターでメジロマックイーンの孫でもありレースでは(オタク特有の早口

参考文献

こちらのサイトでは音声データをフーリエ変換でスペクトログラムにしています。フーリエ変換や倍音について丁寧に説明してくれています。スペクトログラムとは、音声の周波数スペクトル(周波数成分に分解したもの)を時間方向に並べたものです。

スペクトル表示について説明しているサイトも参考になりました

スペクトル、スペクトログラムって何だろう?(音声、音の初心者向け) - Qiita
はじめに教授に「音声波形をスペクトルに変換する理由はなんですか?」と聞かれて答えられなかったため、自分なりにまとめてみた備忘録音声波形をスペクトルに変換する理由はなんですか?音声波形をスペクト…

こちらのサイトは音声データを高速フーリエ変換によってスペクトログラムに作成・可視化を行っているソースコードを公開しています。

フーリエ変換を行うnp.fft.fftの使い方は以下のサイトを参照してください。

numpy.fft.fft — NumPy v2.1 Manual

使用した音声データ

冒頭の動画からスマートファルコンのシャイシャイと、そのモノマネをするゴルシのシャイシャイを約5秒拝借しました。

スマートファルコンはウマ娘の世界ではアイドルで公式で歌っている動画ではとにかく可愛くてアニメの場合(略

スマートファルコンのモノマネをするゴルシです。すごい似ていて驚きました。

スマートファルコンのモノマネをするゴルシのモノマネをする私(映像はTYTANちゃんでお送りしています)。条件を揃えるためにBGMも入れました。とても上手ですね(白目)

フーリエ変換のコード

音声をフーリエ変換してスペクトログラムを可視化するコードです。

import numpy as np
import soundfile as sf
from scipy import signal
import matplotlib.pyplot as plt

#音声データ
filepath = '31-1_falcon.mp3'

#読み込み
data, fs = sf.read(filepath)

#ステレオデータをモノラルデータに変換
if len(data.shape) == 2:
   data = data.mean(axis=1)

#パラメータ
N = 1024   #サンプル数
window = signal.windows.hann(N)  #ハニング窓関数
st = 0
shift = N // 4
spec = np.zeros([len(data) // shift - (N // shift - 1), N // 2])

#高速フーリエ変換
for i in range(len(data) // shift - (N // shift - 1)):
    st = i * shift
    x = data[st:st + N] * window
    F = np.fft.fft(x)
    freq = np.fft.fftfreq(N, d=1 / fs) #周波数スケール
    
    #フーリエ変換の結果を正規化
    F = F / (N / 2)
    F = F * (N / sum(window))
    Amp = np.abs(F)
    
    #パワースペクトルの計算(振幅スペクトルの二乗)
    Pow = Amp ** 2
    
    #デシベル変換
    Pow = 20 * np.log10(Pow / (20 * 10 ** (-6)))
    spec[i, :] = Pow[:N // 2]

#グラフ
y_max = 8000
fig, ax = plt.subplots()
im = ax.imshow(spec.T, origin='lower', extent=(0, (st + N) / fs, 0, freq[N // 2 - 1]), aspect=((st + N) / fs) / y_max, vmin=0, vmax=50)
ax.set_ylim([0, y_max])
ax.set_title('Power Spectrogram')
ax.set_xlabel('time [s]')
ax.set_ylabel('Frequency [Hz]')
plt.colorbar(im)
plt.show()

スマートファルコン(本物)

ゴルシ

スペクトログラムには時間、周波数、強さの3次元要素がすべて表現されていて、逆に音声を復元することも可能です。結果を見ると、「う~~」「シャイ」「シャイシャーイ」がよく分かります。倍音もありますね。

音声のままでは比較しにくかったですが、画像にしてしまえばどうにかして定量化できるのではないかと思います。見た目だけでいえば、本物とゴルシはよく似ている気がします。一方、私は「う~~」の線の傾きが足りないとか、「シャイシャーイ」が上がりきっていないとか、いろいろ粗が見えます、、、さすがプロの声優は違いますね!

さいごに

今回はスマートファルコンを題材にして音声のフーリエ変換を行いました。モノマネをしているゴルシの声優は上田瞳さんという方でナレーションも上手です。私も頑張ったのですが、同性で同じBGMを入れても全然似ていませんでした。スペクトログラムの結果を見たら一目瞭然ですね笑

今後の目標はスペクトログラムの定量比較です。頑張っていきましょう。シャイシャーイ ٩(^ヮ^*)و

追記:続きはこちらです↓

SNS等でお気軽にご連絡ください

※当ブログに関することは何でもご相談・ご依頼可能です(Servicesになくても)
※TwitterはFF外の場合はDMではなく返信orメンションでお願いしますm(_ _)m

情報発信しています

質問・コメントはSlackやDiscordでお気軽に

勉強会の告知はこちらで

音声処理
この記事を書いた人

専門は情報工学とロボット制御。元ロボコニストでRoboCup世界部門優勝常連チーム。ご飯にシチューかける党党首。

この記事をシェアする
Vignette & Clarity(ビネット&クラリティ)
タイトルとURLをコピーしました