AmiVoiceAPIでYouTuberの動画を文字起こししてみた

発言のデータベースというのがありますよね。
公的なものなら国会の議事録だったり、Vtuberの見どころ切り抜きサイトなんかも、発言のデータベースとして分類できるかなと思います。

私の推しYouTuberに __板橋ハウス__ という方々がいます。
東京都板橋にて男3人でシェアハウスをしており、シェアハウスあるあるやコンビニ企画など、毎日動画を更新しています。

<iframe width="560" height="400" src="https://www.youtube.com/embed/qkLQQoFj6y4" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

> こちらが最も再生数が多い動画。
> 個人的おすすめは[【ルームシェア】部屋に面接に来る【就寝活動】](https://www.youtube.com/watch?v=LdCz2JIRB74&pp=ygUM5a-d44GL44Gb5bir)

動画は非常に見どころが多く、印象に残る言葉やまた見返したくなるシーンもたくさんあります。
ですが、見返したくてもどんなワードで調べればよいかわからず、動画も1000本近くあるので、その時は探すのを諦めたなんてことも多々あったりします。

そういった中で発言のデータベースみたいなのを手軽に作れたらいいなあと思い、
文字起こしの第一歩としてAPIの精度などを調べてみました。


## 使用エンジンなど
音声認識エンジンは"会話_汎用"を利用しました。
[Tech Blogの記事](https://acp.amivoice.com/blog/2023-09-29-110638/?_ga=2.14541623.1848334220.1716111555-55996825.1714050470)を読んだところ、今回の場合はこちらが良いのかなと判断しました。

以下のようなコードでAPI自体は実行できます。
```python:python
import requests
import json

url = "https://acp-api.amivoice.com/v1/recognize"

params = {
    "d": "-a-general",
    "u": "{APP_KEY}",
}

files = {
    "a": open("test.wav", "rb"),
}

response = requests.post(url, params=params, files=files)
parsed_response = json.loads(response.text)

print(parsed_response)
```

## AmiVoiceAPIの文字起こしデータを見る
今回は2024年4月の板橋ハウスの動画30本を対象に、APIにて字幕を取得してみました。
参考として、YouTube自動生成字幕のデータも掲載しています。

文字起こししたデータはGoogleスプレッドシートにまとめたので閲覧が可能です。（[202404_板橋ハウス動画‗字幕比較](https://docs.google.com/spreadsheets/d/1VT-wR84q5cuq1P3FnwYAbSYjojvjzGm0YGgAj4ksuw8/edit?usp=sharing)）

### 気になった点①：固有名詞に強い
真っ先に気になった点はこちらです。
人物名に中々いい精度を出していると感じます。
動画内での、吉野さん、住岡さん、竹内さんの名前の呼びかけは8割以上認識されている気がしています。
"すた丼"や"HUNTER×HUNTER"が認識できているのもすごいですね。

> "藤岡藤巻"を認識できて、"呼んじゃった"を認識できないのが面白い
> 誤：藤岡藤巻@だってお前、
> 正：藤岡藤巻呼んじゃった
> 動画：【ルームシェア】家のことやっといてくれる【頼り】

### 気になった点②：TikTokロング系の動画は精度が高い（かも）
板橋ハウスの動画は、基本的に以下再生リストの2種に分けられます。
目視で文字起こしデータを見る限りでは、TikTokロング系の方が正確に見えます。
* TikTokロング
* YouTube企画

TikTokロングでは、動画タイトルのようなテーマを決めてそれに合ったネタが続いていくスタイルとなっています。
固定カメラで基本的に入る声の音量が一定に近いので精度が高いのかもしれませんね。


> 無い単語を認識できるのが凄い
> 誤：これグラタンダンスサークルの朝練やグラタンダンスサークル
> 正：俺グラタンダンスサークルの朝練や グラタンダンスサークル？
> 動画：【ルームシェア】どうしても必要？って言わせよう【不可欠】

一方YouTube企画の動画では、誰かがカメラを持って撮影するスタイルする形です。
コンビニ企画やドライブ動画などはこちらに該当します。
話している声に笑い声が被っていることも多々あり、TikTokロングの動画よりは精度が低く感じます。

> 奇声の部分が発言と混ざって誤認識しているのはよくありそうです
> 誤：今何時ですか25虹割と板橋ハウスのYouTubeを取る時間がちょっと早いですね
> 正：今何時ですか 2時 ポォー 割と板橋ハウスのYouTubeを取る時間にしてはちょっと早いですね
> 動画：【ルームシェア】中1の春にクラスのヒーローになれるものをコンビニで買おう【一軍】

## 信頼度の統計
APIのレスポンスにはconfidence（信頼度）の値も取得してきます。
単語毎と全文で信頼度の値が表示されるので、同様に取得できるstarttimeの値で時間軸のグラフにしました。


こちらはTikTokロング系統の動画です。
赤い点線は単語全ての信頼度の平均値のラインです。
文章全体の信頼度は0.928でしたので、10％程度の差があることがわかります。
[【ルームシェア】やばい奴と同じ意見にされる【味方】_話者ダイアライゼーション.json](https://drive.google.com/file/d/1k5WTWNPKiP4cM5WFkJQwjCrwpn1EeoWK/view?usp=drive_link)

> 【ルームシェア】やばい奴と同じ意見にされる【味方】

![やばい奴統計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795871/e243cf40-fad0-2634-3e17-4c3d67981bd0.png)

グラフにしたはいいものの、時間の間隔がバラバラなせいで、良いグラフかといえばそうじゃないですね。



続いて、YouTube企画系の動画です。
文章全体の信頼度は0.943なので、こちらも10%程度差があります。
[【ルームシェア】アメリカに行く準備をさせよう【プロ】.json](https://drive.google.com/file/d/1YXqD7-XyJoOXHCGY1CHFipr_ho2-fSQS/view?usp=drive_link)

> 【ルームシェア】アメリカに行く準備をさせよう【プロ】

![アメリカ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795871/79c769b1-7983-c598-5e3c-4bfe4831a8ea.png)

分析する意味があるかといわれると微妙なところですが、両グラフともに常に信頼度の値が高い区間というのはほぼ存在しないのがわかります。
2つ目のグラフの620秒あたりが、ギリギリ信頼度0.5を超えてるかな？といったところでしょうか。

同時に話者ダイアライゼーション機能も試していますが、判別しているところとしていないところが存在しています。

## まとめ
Tech Blogのように正しい文章と比較して正答率などを出せればよかったんですが、正しい文章を作る労力がヤバかったので諦めました。
日本語の分析精度は非常に高いので、しっかりとした会話データなどを用いればもっと精度は出せそうです。

__一番いいなと思ったのは、非常に簡単にAPIが使えるというところでした。__
会員登録後にクレジットカードを登録することで、5分もあれば利用までこぎつけるので、簡単に使ってみたいという目的であればベストチョイスになると思います。
過去にAzureやGoogleのAPIを使ったこともありますが、IAMの設定やらなんやらで使うまでのハードルがなかなか高いですしね。

発言のデータベース化というところでは、これ一本で進めていくのは得策ではないといったところでしょうか。
最近GPT-4oモデルなるものが発表され、実際に触ったわけではありませんが、日本語OCRの精度が従来よりかなり高いと各所で目にします。
板橋ハウスの動画は字幕が必ず表示されているので、音声認識よりもOCRを用いた方が確実になりそうです。
これもこれで、個人で払えるコストに収まらなさそうというのが一番の課題ですね。