歌ってみた動画のタイトルから楽曲名を取得する (OpenAI編)

# まとめ

* OpenAIのAPIを利用することで、ほぼコーディングなしで楽曲名の抽出ができる
    * 1動画あたり1円程度
    * 精度は70%程度

# 前提
プロンプトプログラミングについては、下記の記事が参考になりました。
notebookへのリンクもあるので、一度試してみると良いと思います

https://zenn.dev/yu89mo/articles/899b0ad9ac6fc5

# 背景
下記の記事の続編です。

https://qiita.com/miyatsuki/items/cb0ce6ae0e48cf42b1c8

### やりたいこと

入力例: 【歌ってみた】ハロ/ハワユ【手描きPV】
欲しい出力: ハロ/ハワユ

### 前回のやり方で困っていること
* ルールベース/正規表現を管理するのがしんどい
* covered -> coverd の用なtypoも考慮する必要があり、手動管理ではラチがあかないなと思った

# やったこと
### アプローチ

下記のような例文を渡すことで、タイトルの推定を試みた
(動画タイトル -> 楽曲名を改行で区切ったもの）

```
【歌ってみた】炎 -LiSA / 『劇場版「鬼滅の刃」無限列車編』主題歌【covered by 西園チグサ】homura│Demon Slayer : Kimetsu no Yaiba->炎
SHUT-OUT / 白雪巴【オリジナル曲】->SHUT-OUT
『バレンタイン・キッス』を金髪4人で歌ってみた♡->バレンタイン・キッス
「君の名は。」スパークル/RADWIMPS Cover by大神ミオ【歌ってみた/4K】->スパークル
バブルラブ／角巻わため(Cover)->バブルラブ
【JK弾き語り】オラシオン弾いて歌ってみた【物述有栖】->オラシオン
【ときのそら × シグナルP】Wandering Days【オリジナル・ボカロPコラボ第2弾】->Wandering Days
ハッピーシンセサイザ/EasyPop【Covered by 朝日南アカネ/西園チグサ/にじさんじ】->ハッピーシンセサイザ
グッバイ宣言/Chinozo【Covered by 朝日南アカネ/にじさんじ】->グッバイ宣言
【Cover】サンドリヨン (Cendrillon)【レヴィ・エリファ/弦月藤士郎】->サンドリヨン
【オリジナルMV】Pretender / Official髭男dism（covered ）歌ってみた【鈴鹿詩子/にじさんじ】->Pretender
【オリジナルMV】月光/白雪 巴->月光
[オリジナル曲]マヨナカヨナカ(into the midnight)/弦月藤士郎->マヨナカヨナカ(into the midnight)
パッチワーク/森中花咲【森中花咲イメージソング】->パッチワーク
レッド・パージ！！！/ メリッサ・キンレンカ Cover->レッド・パージ！！！
オトメロディー / 高橋美佳子（cover）えま★おうがすと/にじさんじ所属->オトメロディー
daze / じんfeat.メイリアfromGARNiDELiA (covered by ヒモと財布)【歌ってみた】->daze
逆光のフリューゲル / 緑仙&ドーラ (Cover)->逆光のフリューゲル
【オリジナル曲】百鬼マスカレイド【フルトイ】->百鬼マスカレイド
【歌ってみた】しんでしまうとはなさけない！【リゼアン/にじさんじ】->しんでしまうとはなさけない！
ロキ / 不破湊×ましろ Cover->
```

この場合、OpenAIのAPIの戻り値が 「ロキ\n ... 」 となってれば推定成功 

### コード

事前準備

``` python
import os
import openai

openai.api_key = "APIキー"
```

推定

``` python

# 例文
prompt = """【歌ってみた】炎 -LiSA / 『劇場版「鬼滅の刃」無限列車編』主題歌【covered by 西園チグサ】homura│Demon Slayer : Kimetsu no Yaiba->炎
SHUT-OUT / 白雪巴【オリジナル曲】->SHUT-OUT
『バレンタイン・キッス』を金髪4人で歌ってみた♡->バレンタイン・キッス
「君の名は。」スパークル/RADWIMPS Cover by大神ミオ【歌ってみた/4K】->スパークル
バブルラブ／角巻わため(Cover)->バブルラブ
【JK弾き語り】オラシオン弾いて歌ってみた【物述有栖】->オラシオン
【ときのそら × シグナルP】Wandering Days【オリジナル・ボカロPコラボ第2弾】->Wandering Days
ハッピーシンセサイザ/EasyPop【Covered by 朝日南アカネ/西園チグサ/にじさんじ】->ハッピーシンセサイザ
グッバイ宣言/Chinozo【Covered by 朝日南アカネ/にじさんじ】->グッバイ宣言
【Cover】サンドリヨン (Cendrillon)【レヴィ・エリファ/弦月藤士郎】->サンドリヨン
【オリジナルMV】Pretender / Official髭男dism（covered ）歌ってみた【鈴鹿詩子/にじさんじ】->Pretender
【オリジナルMV】月光/白雪 巴->月光
[オリジナル曲]マヨナカヨナカ(into the midnight)/弦月藤士郎->マヨナカヨナカ(into the midnight)
パッチワーク/森中花咲【森中花咲イメージソング】->パッチワーク
レッド・パージ！！！/ メリッサ・キンレンカ Cover->レッド・パージ！！！
オトメロディー / 高橋美佳子（cover）えま★おうがすと/にじさんじ所属->オトメロディー
daze / じんfeat.メイリアfromGARNiDELiA (covered by ヒモと財布)【歌ってみた】->daze
逆光のフリューゲル / 緑仙&ドーラ (Cover)->逆光のフリューゲル
【オリジナル曲】百鬼マスカレイド【フルトイ】->百鬼マスカレイド
【歌ってみた】しんでしまうとはなさけない！【リゼアン/にじさんじ】->しんでしまうとはなさけない！"""

# 推定したい動画のタイトル
target = "ロキ / 不破湊×ましろ Cover"

# 例文にフォーマットを合わせる
prompt += "\n" + target + "->"

response = openai.Completion.create(
    engine="curie", # 精度はdavinciの方がよいが料金が1/10。財布と相談
    prompt=prompt,
    max_tokens=len(target), # 動画タイトルの長さ > 楽曲名なので、動画タイトルの長さを上限とする
    stop="\n" # 楽曲名は改行されていることがないので、stopwordに指定
)

estimated_title = response["choices"][0]["text"]
```

# 精度/コスト

### 条件

* 歌ってみた動画/オリジナル曲の動画を100個ランダムに選択
* 楽曲名の推定結果が完全に一致していた場合、正解とする
* プロンプトに渡す例文は20個をランダムに選択

### エンジンごとの結果
（どの動画を例文に渡すかによってブレるので参考程度）

* davinci: 精度75%程度、1動画あたり10円
* curie: 精度70%程度、1動画あたり1円
* babbage: 精度65%程度、1動画あたり0.2円

### Curieで推定失敗したもの(例)

| 動画タイトル | 楽曲名 | 推定された楽曲名 |
| --- | --- | --- | --- |
| Dua Lipa - Don't Start Now (cover by Akaihaato) | Don't Start Now | Dua Lipa - Don't Start Now |
| 【歌ってみた】ハロ/ハワユ【手描きPV】 | ハロ/ハワユ | ハロ |
| 卯月コウ　「感電」 | 感電 | 卯月コウ |
| 全部自分の声で KING | KING | 全部自分の声 |
| 【オリジナルMV】愛を伝えたいだとか（あいみょん）cover【家長むぎ×鈴鹿詩子×える×夜見... | 愛を伝えたいだとか | 愛を伝えたいだとか 【オリジナル投稿】疯狂/ミルが付いてる -EDシャンプー/木村るると【 |
| あらすじ的なすごいやつ そのに (DJ WILDPARTY megamix) | あらすじ的なすごいやつ そのに | あらすじ的なすごいやつ |
| 【歌ってみた】夢追翔、「完全感覚Dreamer」を歌わせていただきました。【にじさんじ】 | 完全感覚Dreamer | 夢追翔、「完全感覚Dreamer」を歌わせていただきました。 |
| 樋口楓 FRONTIER -Music Video- | FRONTIER | 樋口楓 FRONTIER |
| 気まぐれメルシィKimagure Mercy/アキ・ローゼンタール【歌ってみた】 | 気まぐれメルシィ | 悪ッ切わら |
| 夢追翔 MV「青空を睨む」（Kakeru Yumeoi - Gaze into the sky) | 青空を睨む | 夢追翔 |
| 【オリジナルMV】可愛く『おじゃま虫』歌ってみた★星川サラ【にじさんじ】 | おじゃま虫 | 可愛く『おじゃま虫』_(カンタン試聴) |
| お前も紅蓮華にならないか？『紅蓮華』feat.フミ民in節分【にじさんじフミ】 | 紅蓮華 | お前も紅蓮華にならないか |
| 【初投稿】元気よく「Booo!」歌ってみた★星川サラ【にじさんじ】 | Booo! | 元気よく全開 |
| シド「乱舞のメロディ」 / 星街すいせい(Cover) | 乱舞のメロディ | シド「乱舞のメロディ」 |
| リミッターを歌ったファイアードレイク【にじさんじ】 | リミッター | リミッターを歌ったファイアードレイク |
| 【初投稿】エイリアンエイリアン/家長むぎ【歌ってみた】 | エイリアンエイリアン | エイリアンエイリアン【中央線/通勤電車ストリ |
| ダダダダ天使 | ダダダダ天使 | ダダダダダ |
| 【歌ってみた初投稿】プラチナ / 坂本真綾 【Covered by 朝日南アカネ / にじさ... | プラチナ | ソングコレクション |
| 【試聴動画】メジャー1stシングル『MARBLE』/ 樋口楓 | MARBLE | メジャー1stシングル『MARBLE』 |
| 【オリジナルMV】ファンサ／mona(CV：夏川椎菜) - シスター・クレアcover | ファンサ | ファンサ／mona(CV：夏川椎菜) |
| KING-Kanaria/covered by 鈴鹿詩子【歌ってみた】 | KING | KING-Kanaria |
| U・S - Utako Suzuka［Official Music Video］【鈴鹿詩子オ... | U・S | U・S - Utako Suzuka |
| ｢アカペラ｣WILD CHALLENGER/ボボボーボ・ボーボボ｢1Chorus｣ | WILD CHALLENGER | アカペラ｢1Chorus｣ |


# 所感

* 推定精度自体はルールベースの方が高くできそう
    * プロンプトプログラミングの場合、どうやったら精度上がるのか謎  
* しかし、管理の煩雑さを考えると、OpenAIに全て任せるのも悪くない気がする
* 金額的にはCurieなら許容、Davinciはちょっと高い
    * 1token = おおよそ1文字なので、例文を短くできるなら検討の余地あり
* ハロ/ハワユを正しく認識できる日は来るのだろうか。。。

# 改善の余地がありそうなもの

* 例文として渡すものをちゃんと選ぶ
    * 典型的なもの + 失敗しやすそうなもの？
* 【歌ってみた】など、事前に消しておけそうなものは前処理で消しておく
    * 文字数が減れば、その分安くなる    
    * 推定精度に影響するかどうかは要検証