youtubeの音声をpythonで文字起こしする機会がありまして、音声認識ライブラリのSpeechRecognitionやGCPのSpeech-to-Textなど色々試したんですが、使いやすさ・精度・料金など比較して音声認識AIのwhisperがすご過ぎたのでご紹介です。
外注サイトでは今でも音声の文字起こしの仕事があるんで、久しぶりに当ブログのテーマであるお小遣い稼ぎに使えそうなスクリプトを公開できそうです(‘ω’)ノ
使用感はこんな感じ
使い方
pythonの外部ライブラリを利用する感じで使えますんで手順は簡単です。ライブラリ以外にもOpenAI公式ではありませんがwhisperを利用したwebAPIも無料公開され始めたようなので、ちょっと試してみたいならこっちでもいいかもしれません。
インストール
まずはgitからライブラリをインストールします。
pip install git+https://github.com/openai/whisper.git
サンプルデータの準備
今回whisperの検証に使うテストデータはyoutubeからダウンロードしたmp4ファイルを利用します。他にもwavなどの音声ファイルには普通に対応してますんで、文字起こしの際に特に困る事はないと思います。
サンプルとするyoutube動画のダウンロード方法は下記の記事で紹介してますんで参考にしてみて下さい。
作業はこんな感じ。
これでテストデータの準備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 | 無音さ |
seek | 30秒単位でのID、内部処理は30秒刻みで行われているため |
start | タイムスタンプ:から |
temperature | 言語認識の揺らぎの大きさ、高く設定すると揺らぎが大きくなる |
text | 起こした文字 |
tokens | 文字起こしに関するトークン、こちらの記事が詳しい |
文字起こしで実際に使用するのは、id・start・end・textくらいで十分じゃないかと思われます。
上記サンプルスクリプトで書いているように単純に文字起こししたテキストデータのみ欲しい場合は、result[‘text’]にまとめて入っているのでこれを保存してます。
モデル別精度・速度比較
whisperには下記の通り精度別のモデルが5種類用意されています。

上から順に軽量・低精度→重量・高精度のモデルになっておりまして、ここでは手作業で文字起こししたセリフに対して各モデルがどの程度の精度・速度が出るか検証してみました。テストデータは下記の動画。
上記の動画を見ながら僕が手作業で文字起こししたテキストデータがこちら。
上記のテキストに対して各モデルのパフォーマンスがこちら。
名称 | 類似度 | 速度 |
tiny | 51% | 16秒 |
base | 58% | 25秒 |
small | 74% | 55秒 |
medium | 76% | 2分4秒 |
large | 75% | 4分35秒 |
数値でも表れている通り精度的に実用可能なのはsmall以降かなーと感じました。ただしlargeモデルに関しては一個下のmediumと比較しても精度が若干落ちている上にかなり時間がかかるので、僕の環境ではsmallかmediumかの2択で十分かなといった感じです。
特筆すべきはmediumモデルを使用した際の句読点や感嘆符なども文章で表現されていて、これは僕が手起こしした文章よりもクオリティが高いと言えます。実際にmediumで起こした文章がこちら。
口語の一人語りでこの精度は凄まじいっすわ、「、」「…」「!」「っ」みたいな微妙なニュアンスも表現されてました。この辺は手作業より精度高いかもしれない。。。
デメリット
ないですね。普段使いは本当にwhisperでいいと思います。
現状の不満をひねり出すなら、whisperはリリースされたばかりなので参考文献が乏しい事ですかね。読む事すら難しい専門性の高い記事が多く、僕ら素人にも分かりやすく包括的かつ簡潔に解説している記事の誕生を待っている感じです。
あと機能面でいえば話者分離が行えない事はちっと残念です。3-4人の会話にさらりと話者別にタグを付けて分類できれば最強なので、今後のアップデートに期待したいです。
ただ、別のライブラリと組み合わせてwhisperの話者分離を実現されている方もいるようですが、やっぱwhisper内で完結した機能が欲しいなぁ。
MITライセンスで商売にも使えるし、粗探ししても文句が出ねぇな。
まとめ
個人レベルでの音声認識ニーズはwhisper一択でいいんじゃないスかね。マジで加速度的に世界が便利になってゆく。最高。
個人開発プログラマーを応援するメンバーシップを始めました('ω')ノ
質問・要望・共同作業など、みんなのやりたい事をスマイルがお手伝いします。立ち上げたばかりでよく分かってないので、とりあえず何でもありやってみます。
コメント