人によってLaurelかYannyか聞こえ方が異なる音を分析する

 ITmediaで以下の記事を見かけました。
どう聞こえる? 「Laurel」か「Yanny」かで論争中 - ITmedia NEWS

 ある音声が、"Laurel"(ローレル)"と聞こえるか、"Yanny"(ヤニー)と聞こえるか、個人によって違うようです。

 カタカナ発音で考えると「ローレル」と「ヤニー」では全く別の音で、聞き間違いのしようが無いように思います。
 ちなみに私には普通に「ローレル」に聞こえますが、「ヤニー」と聞こえる人もRedditTwitterの反応を見る限り多く居るようです。

 ちょっと不思議に感じたので、どういった事なのか分析してみました。
 

予想

 HLS(HTTP Live Stream)やMPEG DASHのように、ユーザがインターネット接続している回線の速度によって映像や音声の解像度やビットレートが可変となるテクノロジがあります。
 ユーザは特に意識をすることなく、勝手に回線帯域に応じた品質のコンテンツを視聴することになるため、(遅い回線で)特定の周波数帯域がカットされた状態で聞いているユーザが居るために(そもそも違う音声を聞いているために)、このような割れた反応となっているのではないだろうか?と、仮説を立ててみました(予め書いておくと、この仮説はハズレでした)。

 この仮説の下に、まずは各配信元(オリジナル、RedditTwitter)の配信方式と、その音源のスペックを確認してみます。
 

原音

 この音声はvocabulary.comというオンライン辞書サイトの"laurel"の発音記号を押下した時に再生される音声のようです。
laurel - Dictionary Definition : Vocabulary.com

 PCでアクセスした限りでは、発音記号ボタン押下時に、具体的には以下のメディアが再生されるようになっており、特にHLSやMPEG DASHのようなテクノロジは使われていないようです。

https://audio.vocab.com/1.0/us/L/1DF66F7GBFQ2U.mp3

※vocabulary.com運営企業はニューヨークに存在するようですので、米国著作権法フェアユース要件のresearch目的に合致すると考え本投稿は上記の音声リソースを使用していますが、権利者からクレームがあった場合には削除します。

 なお、このファイルの仕様を確認してみると、拡張子からも明らかですがオーディオコーデックはMP3で、サンプリング周波数44.1kHz、量子化ビット数16bit、ビットレート128kbps、チャネル数1(モノラル)となっています。
 この音声のスペクトログラムを以下に示します。
Laurel spectrogram (original)
 

Redditの投稿

 ITmediaによれば、"Laurel”と聞こえるか"Yanny"と聞こえるかという論争の大本は以下のRedditの投稿のようです。
What do you guys hear ? : blackmagicfuckery

 この投稿に貼られた動画のオーディオストリームに件の音声が含まれています。
 なお、Redditに投稿された動画はMPEG DASHで配信されるようで、この投稿の場合、以下の配信設定ファイルが使用されるようです。

https://v.redd.it/837onxm0tgx01/DASHPlaylist.mpd

 この設定を見ると、映像は帯域によって解像度が可変となっていますが、音声は帯域幅によって変わらない設定となっており、前述の仮説には当てはまりまらないことが解ります。以下に大事なところだけ抜粋します。

<AdaptationSet segmentAlignment="true" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
    <!- 映像ストリームはH.264(avc)で帯域幅毎に解像度が異なる3パターン -->
    <Representation bandwidth="198361" codecs="avc1.4d401f" frameRate="30" height="480" id="VIDEO-1" mimeType="video/mp4" startWithSAP="1" width="270">
    <Representation bandwidth="136184" codecs="avc1.4d401e" frameRate="30" height="360" id="VIDEO-2" mimeType="video/mp4" startWithSAP="1" width="202">
    <Representation bandwidth="82622" codecs="avc1.4d401e" frameRate="30" height="240" id="VIDEO-3" mimeType="video/mp4" startWithSAP="1" width="134">
</AdaptationSet>
<AdaptationSet>
    <!- 音声ストリームはAAC(mp4a.40.2)で帯域幅に拠らず同一 -->
    <Representation audioSamplingRate="48000" bandwidth="133218" codecs="mp4a.40.2" id="AUDIO-1" mimeType="audio/mp4" startWithSAP="1">
</AdaptationSet>

 音声ストリームはセグメント分割もされておらず、以下の単一ファイルがその実体となります。

https://v.redd.it/837onxm0tgx01/audio

 この音声ストリームの仕様を確認してみると、オーディオコーデックはAACで、サンプリング周波数48kHz、量子化ビット数16bit、ビットレート128kbps、チャネル数2(ステレオ)となっています。

 元のvocabulary.comからコーデックが変わっている時点で、再エンコードにより劣化が発生しているのは明らかです。
 サンプリング周波数が高くなっていますが、ソースがデジタル音源である以上高音質化に寄与する訳ではありません。無駄にデータがデカくなるだけです。
 また、ステレオ化されていますが、元はモノラルなのでこれもまた無駄にデータをデカくしているだけです。
 それでいて、ビットレートは128kbpsで元のvocabulary.comと同じままです。
 すなわち、コーデックの差異はありますが、サンプリング周波数が約1.09倍(44.1kHz⇒48kHz)、チャネル数が2倍(モノラル⇒ステレオ)ですから、単純計算で元の約2.17倍の情報量を同一データサイズに詰め込んでいる訳で、圧縮により失われる情報も相当あると考えられます。

 この音声のスペクトログラムを以下に示します。
Laurel spectrogram (Reddit)
 前述の通り(無駄に)ステレオ化されているため左右チャネルが上下に並んでいますが、見て明らかなとおり左右チャネルで差異はありません。同じ音声が両チャネルに記録されています。
 横軸(時間軸)は原音より長くなっていますが、Redditに貼られていたものは"Laurel""Laurel"と2回繰り返されているためです。
 注目すべきは縦軸(周波数軸)で、原音では18kHz前後までの信号が記録されているのが視認できますが、Redditでは12kHz付近で綺麗にカットされているのが確認できます。
 それ以上高い周波数の音が失われているわけですが、Redditの投稿で"Laurel"か"Yanny"か意見が割れているのですから、そもそも12kHz以上の音は今回の議論には影響していないと考えられます。
 

Twitterの投稿

 ITmediaによれば、Redditの投稿がTwitterに転載されたのが以下の投稿のようです。

 Twitterに投稿された動画ではHLSが使われているものだと思っていましたが、この投稿ではHLSは使われておらず、MP4ファイルが直接引き渡されてくるようです(低解像度かつ約3秒と短いためでしょうか?)。

https://video.twimg.com/ext_tw_video/996218345631318016/pu/vid/180x320/E4YbExw0wX1ACH5v.mp4

 この動画の音声ストリームの仕様を確認してみると、 オーディオコーデックはAACで、サンプリング周波数48kHz、量子化ビット数16bit、ビットレート33kbps、チャネル数2(ステレオ)となっています。
 つまり、ビットレートが大幅に低いことを除けばRedditと同様の仕様になっています。Redditの投稿であれだけ劣化していたのですから、今度はより多くの情報が失われていることが予想されます。

 この音声のスペクトログラムを以下に示します。
Laurel spectrogram (Twitter)
 Reddit同様(無駄に)ステレオ化されているため左右チャネルが上下に並んでいますが、見て明らかなとおり左右チャネルで差異はありません。同じ音声が両チャネルに記録されています。
 横軸(時間軸)はReddit同様に"Laurel""Laurel"と2回繰り返されているため原音より長くなっています。
 縦軸(周波数軸)はRedditよりさらに低くなり6kHz付近でカットされているのが確認できます。
 Twitterの投稿でも"Laurel"か"Yanny"か意見が割れているのですから、6kHz以上の音は今回の議論には影響していないと考えられます。
 

整理

 ここまでの調査で明らかなように、配信方式とその音声仕様によりそもそも各ユーザが聴いている音声が違うのではないかと言う当初の仮説は外れています。
 各配信元の差異を確認しているうちに判ったのは以下の1点のみです。

  • 6kHz以上の周波数成分は"Laurel"/"Yanny"議論には無関係

 ということで、この音声そのものの6kHz未満の成分に何か原因があるようですので、調べてみます。
 

音自体の分析

 原音のスペクトログラムを以下に再掲します。
Laurel spectrogram (original)

 ぱっと見た感じでは目立つピークは以下の3つに分類できそうです。
A. 概ね1kHz以下で微妙に変動しているライン群
B. 3kHz付近で始まり600ms付近で2kHz未満に落ちて再び3kHz付近まで戻るピーク
C. それより高い周波数のライン群(但し6kHz以上は今回の議論には無関係)

 A, B, Cそれぞれを分離してみます。

 なお、これまでに掲載してきたスペクトログラムはSoXで生成したものですが、以下は波形編集に使ったツール*1スクリーンショットを掲載します。

 やっていることは、イコライザ(EQ)で抜き出したい周波数以外をカットしているだけです。
 このツールではスペクトログラム上にレベルを指定するカーブ(エンベロープ)を直接描くことができ、今回の用途では直感的に操作できるため使っていますが、A, B, Cそれぞれは適切なカットオフ周波数及びQ値を指定できるならローパスフィルタ(LPF), バンドパスフィルタ(BPF), ハイパスフィルタ(HPF)を使って抜き出すことも可能でしょう。
 今回のように特定の周波数の音をいじりたいのであれば、お高いですが*2SpectraLayersのような専用のソフトを使うと捗ります。

 

Aを分離

 以下のような設定で抜き出してみます。
Laurel extract setting
 これで得られた音は以下の通り。

※音声再生には、HTML5 audioタグをサポートするブラウザが必要です。

 私の耳には普通に"Laurel"に聞こえます。
 

Bを分離

 以下のような設定で抜き出してみます。
Laurel/Yanny extract setting
 これで得られた音は以下の通り。

※音声再生には、HTML5 audioタグをサポートするブラウザが必要です。

 私の耳には不明瞭な籠った感じの"Laurel"っぽく聞こえますが、再生音中の周波数高そうな部分に変な音("Yanny"だと言われればそうかもしれない)も聞こえます。
 

Cを分離

 以下のような設定で抜き出してみます。
Yanny extract setting
 これで得られた音は以下の通り。

※音声再生には、HTML5 audioタグをサポートするブラウザが必要です。

 ついに私の耳にも"Yanny”っぽく聞こえます!
 

確認

 念のため意図通りに抽出できているかA, B, Cの各音声のスペクトログラムを確認してみます(以降は再びSoXで生成したスペクトログラム)。

  • A
    f:id:kachine:20180517043522p:plain
  • B
    f:id:kachine:20180517043602p:plain
  • C
    f:id:kachine:20180517043623p:plain

 スペクトログラムを見つつ耳で聞きながらEQ設定したので、微妙にBの周波数帯域の一部がA, Cに混ざっていますが、概ね意図通りに分離・抽出できています。
 

まとめ

 ざっくりまとめると、以下のようになるかと思います。

  • およそ2~3kHz以上の成分が"Yanny"っぽく聞こえる
  • およそ2kHz以下の成分が"Laurel"に聞こえる
  • これらの成分が同時に鳴っているため、人によってどちらに聞こえるかが違う

 なお、音量レベルはYannyの成分の方がだいぶ小さいので、原音を聴いて"Laurel"と"Yanny"の両方を知覚することはあっても、"Yanny"にしか聞こえないということは恐らく無いと思うのですが、そうではない人も居るのでしょうかね?
 

備考

 ITmediaの記事末尾の方で、私が上記で行ったのと同様にParametric EQで特定周波数帯域をカットしている動画が紹介されています。その動画について、

ピッチを下げると「ヤニー」に聞こえるとして解説するYouTube動画も公開された。

 と、記述されていますが、完全な誤りです。正しくは、「低域をカットすると「ヤニー」に聞こえるとして解説するYouTube動画も公開された。」となるはずです。
 記者の方が理解していないのか誤解しているのか判りませんが、ピッチ(=音程)を操作しているのではなく、通過させる周波数(遮断する周波数)を操作しているのです。
 



以上。

*1:FL Studio12のビルトイン波形エディタのEQ

*2:いつのまにかSourcenextが日本代理店になっており、キャンペーン中ならそれほど高くないっぽいです。