【耳以上】音声認識AI whisperをpythonで動かしてyoutube動画を文字起こしする

youtube

youtubeの音声をpythonで文字起こしする機会がありまして、音声認識ライブラリのSpeechRecognitionやGCPのSpeech-to-Textなど色々試したんですが、使いやすさ・精度・料金など比較して音声認識AIのwhisperがすご過ぎたのでご紹介です。

外注サイトでは今でも音声の文字起こしの仕事があるんで、久しぶりに当ブログのテーマであるお小遣い稼ぎに使えそうなスクリプトを公開できそうです(‘ω’)ノ

使用感はこんな感じ

音声認識AIwhisperでyoutubeの文字起こしをする作業動画

使い方

pythonの外部ライブラリを利用する感じで使えますんで手順は簡単です。ライブラリ以外にもOpenAI公式ではありませんがwhisperを利用したwebAPIも無料公開され始めたようなので、ちょっと試してみたいならこっちでもいいかもしれません。

インストール

まずはgitからライブラリをインストールします。

pip install git+https://github.com/openai/whisper.git

サンプルデータの準備

今回whisperの検証に使うテストデータはyoutubeからダウンロードしたmp4ファイルを利用します。他にもwavなどの音声ファイルには普通に対応してますんで、文字起こしの際に特に困る事はないと思います。

サンプルとするyoutube動画のダウンロード方法は下記の記事で紹介してますんで参考にしてみて下さい。

作業はこんな感じ。

youtubeの動画を超速でダウンロードするpythonスクリプト #shorts

これでテストデータの準備OK!

文字起こしする

文字を起こして.txtに保存するスクリプトはこう。

import whisper
import json

model = whisper.load_model("small") #モデルの指定
result = model.transcribe("ファイルパス", verbose=True, fp16=False, language="ja") #ファイルの指定
print(result['text'])

f = open('transcription.txt', 'w', encoding='UTF-8')
f.write(json.dumps(result['text'], sort_keys=True, indent=4, ensure_ascii=False))
f.close()

いずれのモデルも最初の一回目はDLか読み込みかが発生するようで数分間のロードが発生していましたが、2回目以降は純粋に文字起こしのみの時間で済むようです。

出力データの中身

はい、文字起こしの処理がおわりました。resultに返り値が入っていますんで覗いてみるとこんな感じのjsonデータが確認できます。

{
    "language": "ja",
    "segments": [
        {
            "avg_logprob": -0.3661023408938677,
            "compression_ratio": 1.6920415224913494,
            "end": 3.62,
            "id": 0,
            "no_speech_prob": 0.03534267097711563,
            "seek": 0,
            "start": 0.0,
            "temperature": 0.0,
            "text": "おもしろ兄弟のエピソードが話すかお姉ちゃんの話をするか",
            "tokens": [~]
        }
}

中身を僕の理解で簡単に説明するとこんな感じ、間違ってたらごめんなさい。

名称内容
avg_logprob有音さ
compression_ratio圧縮率、キーワードの繰り返しに影響
endタイムスタンプ:まで
id文字起こしの分割番号
no_speech_prob無音さ
seek30秒単位でのID、内部処理は30秒刻みで行われているため
startタイムスタンプ:から
temperature言語認識の揺らぎの大きさ、高く設定すると揺らぎが大きくなる
text起こした文字
tokens文字起こしに関するトークン、こちらの記事が詳しい

文字起こしで実際に使用するのは、id・start・end・textくらいで十分じゃないかと思われます。

上記サンプルスクリプトで書いているように単純に文字起こししたテキストデータのみ欲しい場合は、result[‘text’]にまとめて入っているのでこれを保存してます。

モデル別精度・速度比較

whisperには下記の通り精度別のモデルが5種類用意されています。

上から順に軽量・低精度→重量・高精度のモデルになっておりまして、ここでは手作業で文字起こししたセリフに対して各モデルがどの程度の精度・速度が出るか検証してみました。テストデータは下記の動画。

【切り抜き漫画】💩漏らして姉に見つかった話

上記の動画を見ながら僕が手作業で文字起こししたテキストデータがこちら。

大代姉妹のエピソード話すか お姉ちゃんの話をするか 大代は小3の頃に えっと 一学期の終業式で色々持ち 持ち帰ってたんすよ その教科書とか ロッカーにぶち込んでたなんか工作 なんか作った作品とかをめちゃくちゃ両手に持って帰ってあの 下校してる最中にめちゃくちゃトイレに行きたくって 大の方だったんですよ 大の方で その時 お ウンチしたいって思ってから お家に帰るまでの距離が 結構遠くて 20分くらいあったんすよ そんな時でも限界で ウンチを小出しに漏らしながら帰っちゃったんすね そうウンチを漏らしながら帰って そのウンチを 溜め パンツの中にその モッコリ収まってるから即座にお家に着いて 慌てて荷物とか置いて トイレでパンツひっくり返してウンチを 流してでもそん時さ大代洗濯機の使い方とか 布を自分で洗った事が無かったから あの 自分の当時の自分の机の勉強机の引き出しにウンチが付いたパンツを あの 奥底にしまったんですよ そん時当時小学生だった大代とお姉ちゃんって 一緒の部屋だったんですよ で お姉ちゃんと一緒の部屋なもんだから ウンチも匂う ウンチも臭うもんだからさ その お姉ちゃんが学校から帰ってきて 部屋に入ってきてお姉ちゃんがまず第一声に え臭くない って 臭くないって言ってきて で大代は本当にバレると思って 何がって キレながら何が臭くないしって全然 大代大代疑われてるわけじゃないのに大代めっちゃキレながら臭くない そんな感じで反応しちゃったからさ それでお姉ちゃんが腹を立てて その匂いの 根本を探りまわされたんよ もうそしたらさ机らへんが臭いって言われて なんか引き出し全部片っ端から開けられてパンツをねー パンツをさー 見つかっちゃったんすよ すごいね すごい弄られたお姉ちゃんに ウンチ女って ひどくないこの話 ウンチ女ウンチ女って言ってもう大代大代泣いちゃったもんね そんな感じで信頼関係を構築した 構築できたかな どうみんな

上記のテキストに対して各モデルのパフォーマンスがこちら。

名称類似度速度
tiny51%16秒
base58%25秒
small74%55秒
medium76%2分4秒
large75%4分35秒
精度はhttps://ofo.jp/similarity.phpで計算

数値でも表れている通り精度的に実用可能なのはsmall以降かなーと感じました。ただしlargeモデルに関しては一個下のmediumと比較しても精度が若干落ちている上にかなり時間がかかるので、僕の環境ではsmallかmediumかの2択で十分かなといった感じです。

特筆すべきはmediumモデルを使用した際の句読点や感嘆符なども文章で表現されていて、これは僕が手起こしした文章よりもクオリティが高いと言えます。実際にmediumで起こした文章がこちら。

大城兄弟のエピソードを話すか、お姉ちゃんの話をするか大城は小3の頃に、えっと、一学期の修行式でいろいろ持ち…持ち帰ってたんですよ、その教科書とかロッカーにぶち込んでたなんか工作、なんか作った作品とかをめちゃくちゃ両手に持って帰ってあの、下校してる最中にめちゃくちゃトイレに行きたくって台の方だったんです よ、台の方でその時、お、うんちしてって思ってからお家に帰るまでの距離が結構遠くて20分ぐらいあったんですよ、その時でもう限界でうんちを小出しに漏らしながら帰っちゃったんですねうんちを漏らしながら帰って、そのうんちをためあの、パンツの中にその、もう、もっこり収まってるから即座にお家に着いて、もうあわてて 荷物とか置いてトイレでパンツひっくり返してうんちを流してでもその時さ、お城、洗濯機の使い方とか布を自分で洗ったことがなかったからあの、自分の当時の自分の机の勉強机の引き出しにそのうんちがついたパンツを、あの、奥底にしまったんですよで、その時、その当時小学生だったお城とお姉ちゃんって一緒の部屋だったん ですよで、お姉ちゃんと一緒の部屋なもんだからうんちもにおう、うんちもにおうもんだからさ、そのお姉ちゃんが学校から帰ってきて、部屋に入ってきてお姉ちゃんがまず第一線に、え、臭くないって臭くないって言ってきてで、お城も本当にバレると思って何が!?ってもう着れながら何が!?え、臭くないし!って言ってもう全然、お城、お城を疑えてるわけじゃないのにお城めっちゃ着れながら臭くないもうなんかそんな感じで反応しちゃったからさそれでお姉ちゃんが腹を立ててその匂いの根本を探り回されたんよそしたらさもう、机ら辺が臭いって言われてで、なんか引き出し全部片っ端から開けられてパンツをね、パンツを見つかっちゃったんすよすっごいね 、すっごいいじられたお姉ちゃんにうんち女ってひどくない?この話うんち女、うんち女って言ってお城、お城泣いちゃったもんねそんな感じで信頼関係を構築した構築できたかな?どう?みんな

口語の一人語りでこの精度は凄まじいっすわ、「、」「…」「!」「っ」みたいな微妙なニュアンスも表現されてました。この辺は手作業より精度高いかもしれない。。。

デメリット

ないですね。普段使いは本当にwhisperでいいと思います。

現状の不満をひねり出すなら、whisperはリリースされたばかりなので参考文献が乏しい事ですかね。読む事すら難しい専門性の高い記事が多く、僕ら素人にも分かりやすく包括的かつ簡潔に解説している記事の誕生を待っている感じです。

あと機能面でいえば話者分離が行えない事はちっと残念です。3-4人の会話にさらりと話者別にタグを付けて分類できれば最強なので、今後のアップデートに期待したいです。

ただ、別のライブラリと組み合わせてwhisperの話者分離を実現されている方もいるようですが、やっぱwhisper内で完結した機能が欲しいなぁ。

MITライセンスで商売にも使えるし、粗探ししても文句が出ねぇな。

まとめ

個人レベルでの音声認識ニーズはwhisper一択でいいんじゃないスかね。マジで加速度的に世界が便利になってゆく。最高。

個人開発プログラマーを応援するメンバーシップを始めました('ω')ノ

質問・要望・共同作業など、みんなのやりたい事をスマイルがお手伝いします。立ち上げたばかりでよく分かってないので、とりあえず何でもありやってみます。

コメント