最近のChatGPTの盛り上がりがすごく、仕事にも影響しそうな状況になってきている。今までNLP系は縁がなかったが、OpenAIが文字起こしのアルゴリズムのWhisperを試してみた。予想以上に正確で、工夫すれば仕事にも十分使えそうな感触を得た。

Whisperとは

WhisperはOpenAIが2022年12月に公開した音声認識モデル(speech to text)。大きく2つの機能があり、一つは会話をテキストに落とすこと、もう一つは翻訳作業(2023年5月時点では、英語への翻訳のみ)をやってくれる。使用方法とコードは以下に公開されている。

https://platform.openai.com/docs/guides/speech-to-text

https://github.com/openai/whisper

基本的にはTransfomerをベースとして実装されており、68万時間もの多言語、マルチタスク(英語の文字起こし、他の言語の文字起こし、英語への翻訳、音声なし)のデータを使用している。ChatGPTにしても、大規模言語モデル(LLM)のデータ量はとても日本企業が太刀打ちできるような領域でなくなっている。

使用方法

最近のAIモデルはAPIが公開されていて、最低限の環境の使い方がわかってると、誰でも使えるレベルになっている。Google colabを立ち上げて、以下のコードを打ち込むだけで結果を出してくれる。

まずopenaiをインストールする。

!pip install openai

APIの使用には、APIキーを入れる必要があるので、OpenAIのサイトでクレジット決済の情報を登録して、APIキーを取得して、下記の2行目に入力する。

import openai
openai.api_key ="APIキーを入力"

その後に文字起こししたい音声ファイル(mp3を使用)をアップロードし、以下のコードを実行すると文字起こしした結果を返してくれる。

audio_file= open("/content/supermarket2.mp3", "rb")
transcript = openai.Audio.transcribe("whisper-1", audio_file)
print(transcript.text)

英語に翻訳する場合は、transcribeをtranslateに変更するだけで対応できる。

audio_file= open("/content/supermarket2.mp3", "rb")
transcript = openai.Audio.translate("whisper-1", audio_file)
print(transcript.text)

ChatGPTと組み合わせて、文字起こしした内容を要約するには以下のコードで実行できる。

PROMPT_BASE = "次の文章を50字程度で要約してください。"
prompt = PROMPT_BASE + transcript.text

response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "user", "content": prompt}
    ]
)

print(response["choices"][0]["message"]["content"])

結果

まず最初にスーパーで買い物行ったときにiPhoneで録音した特売品コーナーの音声。自分の耳では聞き取れるが、うまく文字起こしができていない。特売品コーナー独特の音楽が邪魔をしているのか、ノイズの多い環境が影響を与えているのか。

1988年に東京都大震災により、 東京都の地震が発生し、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、 東京都の地震発生により、

音楽からの歌詞の文字起こしは元々想定された使い方のはずなので、試しに邦楽で文字起こしができるかをテストしてみた。Beginの島人ぬ宝だが、ほとんど問題なく文字起こしができている。デンサー節が電車節となっているのはローカルの沖縄の曲名を知らないとできないので仕方がない。よくわからないのは、2番と3番の歌詞が役になっていることだ。あと、最後によくわからない文章が入っている。スーパーの音声がうまくいかなかったのはやはり周囲のノイズの影響か。。

僕が生まれた この島の空を 僕はどれくらい知ってるんだろう 輝く星も 流れる雲も 名前を聞かれても わからない でも誰より 誰よりも知っている 悲しい時も 嬉しい時も 何度も見上げていた この空を 教科書に書いてあることだけじゃ わからない 大切なものがある 僕が生まれた この島の歌を 僕はどれくらい知ってるんだろう トバラマも 電車節も 言葉の意味さえ わからない でも誰より 誰よりも知っている 祝いの夜も 祭りの朝も どこからか聞こえてくる この歌を いつの日か この島を離れてく その日まで 大切なものをもっと深く知っていたい それが島の歌だから 嘘がきっとここにあるはずさ それが島の歌だから 僕が生まれた この島の海を 僕はどれくらい知ってるんだろう 汚れてくサンゴも 減ってゆく魚も どうしたらいいのか わからない でも誰より 誰よりも知っている 砂にまみれて 波に揺られて 少しずつ変わってゆく この海を それが島の歌だから それが島の歌だから サブタイトル コメント よろしくお願いします!

次はニュース番組の音声。珠洲市の漢字が間違えているが、ほぼ完璧に文字起こしができている。mp3自体は1分半ぐらいのものだが、文字起こし自体は数秒で終わるので、よほどのリアルタイム性を要求しない限りは、実用上は全く問題ない。少なくともキーボードでタイピングするよりもはるかに速い。

一昨日震度6強を観測した石川県涼市では雨の降り方が強まっています 市は一部の地域に避難指示を発表し住民は不安と隣り合わせの夜が続いています 涼市は大雨による土砂災害の恐れがあるとして昨日午後5時過ぎ 市内の740世帯1630人に避難指示を発表し 学校や公民館など20箇所に避難所を開設しました 上空から撮影した映像では市内のあちこちで住宅が倒壊したり 瓦屋根が壊れたりしていました 石川県ではこれまでに1人が死亡33人が怪我をし涼市では6件の住宅が倒壊して います 石川県の涼市と野戸町には大雨警報が発表されていて 今日未明にかけて1時間に30ミリの激しい雨が降るところがある見込みで土砂災害に 警戒が必要です こちらは涼市にある道の駅鈴成りの地震発生時の様子です こちらでは地震発生当時30人から40人の客がいましたが立っていられないほどの 揺れでしゃがみ込んでいました 中には赤ちゃんを抱きかかえて必死に揺れに耐える人もいましたがその後 全員外に避難して怪我はありませんでした 店では床一面に商品が散乱し酒や醤油の瓶が10本ほど割れたということです 去年6月の震度6弱の地震を教訓に商品が倒れないようにガードしていてこれがなければ 被害が拡大したのではないかと話していました 店は昨日正午過ぎに再開しました 横浜から帰省した男性は帰ってきたら必ずここに来ます 再開して嬉しいですと話していました

次に英語で文字起こしを行なってみた。前半部分はかなり間違っており、内容が変わってしまっている。日本語の文字起こしができているのに、勿体無い。一旦日本語にした後、それを翻訳した方が精度が高いのかもしれない。

In Shizu City, Ishikawa Prefecture, where we observed the 6th day of the new year, the rain is getting heavier. The city has announced evacuation instructions to some areas, and residents are worried about the night of the next meeting. In Shizu City, there is a risk of a car accident due to heavy rain, so yesterday afternoon, the city announced evacuation instructions to 1,630 people, and 20 evacuation centers were opened. In the video taken from the sky, houses were destroyed and the roof of the river was broken. In Ishikawa Prefecture, one person has died and 33 people were injured, and 6 houses have been destroyed in Shizu City. In Shizu City and Noto Prefecture, Ishikawa Prefecture, heavy rain is forecast, and it is forecast that heavy rain will fall for an hour and 30 mm today. This is the situation when the earthquake occurred in Suzunari, a roadside station in Shizu City. There were 30 to 40 people at the time of the earthquake, but they were crouching in a shaking state that they could not stand. Some of them were holding their babies and desperately enduring the shaking, but after that, they all evacuated and were not injured. The store was in a state of chaos, and 10 bottles of sake and soy sauce were broken. Last June, the store was guarding the store so that the goods would not fall, and it was said that if this was not the case, the damage would have been greater. The store was reopened yesterday afternoon. The man who was evacuated from Yokohama said, I will definitely come here when I come back. I'm glad to be back.

最後にWhisperで文字起こししたものを、ChatGPTで要約してみた。同じ内容の石川県の地震の内容だが、前半と後半で少し説明内容が違うので、まとめ方も微妙なものになってしまっている。

石川県涼市では震度6強の地震があり、大雨が続いているため、一部の地域に避難指示が出された。涼市では土砂災害に警戒が必要で、6件の住宅が倒壊した。店舗では震度6弱の地震を教訓に商品をガードし、再開している。

まとめ

綺麗な音声を入力すると予想以上に正確に文字起こしをしてくれる。複数の話者などを試してないが、話者の識別がうまく対応する仕組みや、音声の入力の仕方の工夫、何かうまく後処理で整える仕組みがあると、使える部分はかなりあるような気がする。

これまで自然言語処理は日本語の壁があり、そのあたりは海外のベンダーからすると参入障壁となると思っていたのだが、データさえ準備できれば障壁はほとんどないように感じた。