【音声認識】AIに空耳アワーは作れるのか

# はじめに
空耳アワーという番組を御存知でしょうか？
<iframe width="560" height="315" src="https://www.youtube.com/embed/qBCqVj_-UYY?si=BtZgmOUo8rH_O9ZM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

空耳アワーとは
>視聴者から「日本語以外で歌われているが、あたかも日本語のように聞こえる歌詞」（「空耳」と呼んでいる）の投稿を募り、制作サイドでつけたイメージ映像を交えて紹介するという内容である。(引用Wikipedia:https://ja.wikipedia.org/wiki/%E7%A9%BA%E8%80%B3%E3%82%A2%E3%83%AF%E3%83%BCより)

さて私はこちらのコーナーが大好きでした。しかしながら昨年、完全に終了してしまい寂しい日々が続いているなか、そこで、こちらの空耳アワーをAIを使い大量に生成できないかと思い立ちました。
# Whisperとは
空耳アワーを大量に生成するうえで思いついたのがWhisperを使うという方法です。
WhisperとはあのOpenAIによる自動音声文字起こしAIとなっております。

https://udemy.benesse.co.jp/data-science/whisper.html

こちらのWhisper、transcribeメソッドの引数languageで認識する音声が何語なのかを任意に設定できるようです。こちらのWhisperですが本来であれば、議事録の文字起こしツールなどに使えるはずです。
しかしながら、元の音楽の歌詞が日本語ではない外国語の曲の音声を、引数のlanguageを日本語として設定して認識させれば空耳アワーが生成できるのでは?!と考えました。
# とりあえず音声データをそのままWhisperに突っ込んでみる
一旦、何も考えずに適当な洋楽の音声データをlanguageを日本語に設定し、Whisperにそのまま突っ込んでみます。Whisperの出力はこうなりました。曲はなかやまきんに君でおなじみBon Joviで「It's my life」です。4分近くあります。
```
Thank you.
```
この１行のみでした。やはりいろいろ調整する必要がありそうです....
# いろいろ調整してみた結果
どのように調整したかについて説明します。細かい説明が必要なく、結果だけ知りたい方を本節を読み飛ばしていただいて大丈夫です。
以下の４Stepを踏ませて調整していきました。

### Step1  Demucsによるボーカル抽出
海外曲の音声データで今回必要なのはボーカルが発している音のみです。ですのでまずDemucsというボーカルを抽出できるAIを用いてボーカルのみの音声データを作成します。
こちらはDemucsのパッケージをインストールしコマンドで作成することができます。
```
demucs -d cpu <<音声データのファイルパス>>
```

### Step2 Whisperによるフレーズ分割
先ほどの例では長尺の海外曲をそのままWhisperに入力すると、音声データが長すぎるあまり(日本語として)うまく認識できていませんでした。フレーズごとで曲を分割していく必要がありそうです。日本語で認識させる前に原曲の原語でWhisperにより認識させます。
```python
import whisper
from pydub import AudioSegment

# モデルのロード
model = whisper.load_model("large")
# 音声ファイルを読み込み

audio_path = <<demucsによるボーカル抽出した音声ファイル>>
#原曲の原語が英語の場合、language="en"とする
audio = AudioSegment.from_file(audio_path,language="en")

# 音声ファイルの処理とセグメントの取得
result = model.transcribe(audio_path)
```
すると変数resultには以下のようにフレーズごとにリストとして、そのフレーズの開始秒数、終了秒数が格納されています。
```
{'text': " Slip inside the eye of your mind Don't you know you might find A better place to play You said that you've never been But all the things that you've seen Slowly fade away So I start a revolution from my bed Cause you said the brains I had went to my head Step outside, summertime's in Stand up beside the fireplace Take that look from off your face You ain't ever gone And burned my heart out As old Sally can wait She knows it's too late As we're walking on by Her soul slides away But don't look back in anger I heard you say Don't look back in anger I heard you say Take me to the place where you go Where nobody knows If it's night or day But please don't Our temperature's in your hands Of a rock and roll band A rock and roll band A rock and roll band But gimme what you got We'll throw it all away I'm gonna start a revolution from my bed Cause you said the brains I had went to my head Stand by my side cause summertime's in move Stand up beside the fireplace Take that look from off your face Cause you ain't ever gonna burn my heart out So Sally can wait She knows it's too late As she's walking on by My soul slides away But don't look back In anger I heard you say I heard your voice And I heard you say So Sally can wait She knows it's too late As we're walking on by My soul slides away But don't look back In anger I heard you say So Sally can wait She knows it's too late As she's walking on by My soul slides away But don't look back in anger Don't look back in anger I heard you say At least not today",
 'segments': [{'id': 0,
   'seek': 0,
   'start': 0.0,
   'end': 14.5,
   'text': ' Slip inside the eye of your mind',
   'tokens': [50365, 6187, 647, 1854, 264, 3313, 295, 428, 1575, 51090],
   'temperature': 0.0,
   'avg_logprob': -0.25330470470671956,
   'compression_ratio': 1.3304347826086957,
   'no_speech_prob': 0.818024754524231},
  {'id': 1,
   'seek': 0,
   'start': 14.5,
   'end': 17.86,
   'text': " Don't you know you might find",
   'tokens': [51090, 1468, 380, 291, 458, 291, 1062, 915, 51258],
   'temperature': 0.0,
   'avg_logprob': -0.25330470470671956,
   'compression_ratio': 1.3304347826086957,
   'no_speech_prob': 0.818024754524231},
  {'id': 2,
   'seek': 0,
   'start': 17.86,
   'end': 20.04,
...
   'temperature': 0.0,
   'avg_logprob': -0.2961134910583496,
   'compression_ratio': 0.8095238095238095,
   'no_speech_prob': 0.03397802263498306}],
 'language': 'en'}
```
### Step3 Whisperによる歌詞日本語認識
さてさきほどのStep2でフレーズごとに分割した海外曲の音声ファイルを音声の設定を日本語にしたWhisperに入力して、最終的な空耳日本語歌詞を作っていきます。
```python
result1 = model.transcribe(path, language='ja',temperature=1.0)
```
もしうまく認識できないのであれば、音声ファイルをスロー再生するなどして調整するという手があります。
### Step4 ChatGPT APIによる調整
Whisperに日本語として入力させ、でてきた日本語空耳歌詞ですが一部、意味不明な日本語の単語ですらないカタカナの羅列になっているものがありました。こちらはちょっとずるいのですがChatGPTAPIを頼りましょう。その意味不明なカタカナの羅列の後にプロンプトとして
「こちらは日本語の単語の羅列ですが、誤字脱字が含まれます。できる限り元の文章の文字数を変えずに修正してください。出力は修正した日本語のみにしてください。」
とします。
# カンナムスタイルで実装
![代替テキスト](https://danmee.jp/wp-content/uploads/2021/03/HwangMinWoo-littlepsy2.jpg)

さて以上のステップによりAIによる空耳アワーを作成できます。本家の空耳アワーでは海外の曲の一節のみを空耳としますが、今回曲の全てを空耳アワーを作成しました。曲は１０年ほど前にはやったKPOPアーティストPSYさんによる**カンナムスタイル**です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/RBjnOfunixU?si=psZJyTZQAw54vISi&amp;start=7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 結論
やはり本家、空耳アワーと比較すると「面白さ」「はまり具合」という観点で低クオリティ感が否めません。
ただ一部、フレーズ「歓迎をさせろ」「きれいな脳、きれいな脳」はまあまあ上手にはまっていたのではないでしょうか。また気が向いたらより高クオリティになるよう頑張ってみようと思います。
# 参考

https://qiita.com/reriiasu/items/5ad8e1a7dbc425de7bb0

https://note.com/mayu_hiraizumi/n/n02cf8212be71