T.H/ 2024年 2月 29日/ 技術

はじめに

こんにちは。T.H.です。
今回は、ここまでAIの精度が上がってきたのなら、あり合わせで議事録を自動作成できないか、ということをなんとなく思い立ったので、その実験内容を記載します。

必要な機能

議事録を自動作成するにあたって、ざっくり必要な機能を考えてみます。

  • 録音データから、あるいはリアルタイムに文字起こしをする
    • (オプション)文字起こしの際に話者分離をする
  • 文字起こしから要約を作成、議事録に整形する

実行環境は色々考えられますが、まずはどこでも動けば良しとします。
今回は文字起こしを中心に、議事録整形部分も少し触れていきます。

文字起こし

昨今は様々な文字起こしサービスやアプリケーションがありますが、今回は実験なのでまずは気楽に試せるものがよさそうです。

選定

Speech-to-Text

Google製、APIで提供。有料です。
弊社はウェブ会議においてGoogle Meetを使用することが多く、Googleでそろえておく事にはメリットがありそうです。
Google Driveに保存された録音をGASでAPI送る、というのがまず思いつく構成ですね。

SpeechRecognition

フリーのPythonライブラリ。文字起こしのエンジンとして裏側で各種APIやライブラリを利用している。
pipで導入できるため、導入が簡単。

Whisper API

OpenAI製、APIで提供。有料です。
あのOpenAI社が提供しているため、精度は期待できそうな気がします。

Whisper

OpenAI製、Pythonのライブラリとして提供されています。こちらは無料。
今回は、こちらを採用し、実験を進めることにしました。
無料、導入が簡単、精度も期待できそう、GPU無しでも動作可能、といったところが理由になります。

その他

少し調べただけでもアプリ、サービス、ライブラリと上記以外にも大量に出てきました。
アプリ、サービスは基本有料のため、今回の選択肢からは一旦外しておきます。あくまで実験なので。
議事録自動作成アプリもすでにいくつか発売されていますね。それらを買ってしまえば今回の実験も不要という事実は見ないことにします。

Whisperの導入

公式のGitHubに導入手順が書いてあります。WSLでも導入可能です。
https://github.com/openai/whisper

pip install -U openai-whisper

でOKです。
ffmpeg,setuptools-rustのインストールが必要になる場合があります。
そちらもGitHubのReadMeを参照してインストールすれば問題ありません。

以上です。簡単ですね。

Whisperの実行

モデル

実行前に、モデルについて簡単に説明します。
tiny,base,small,medium,largeの順にサイズ/処理負荷は大きく、精度は高くなります。
Required VRAM の記載がありますが、GPU無しでも動きます。medium以上はつらいですが。
事前ダウンロードも不要です。

Size Parameters English-only model Multilingual model Required VRAM Relative speed
tiny 39 M tiny.en tiny ~1 GB ~32x
base 74 M base.en base ~1 GB ~16x
small 244 M small.en small ~2 GB ~6x
medium 769 M medium.en medium ~5 GB ~2x
large 1550 M N/A large ~10 GB 1x

Whisperの実行コマンド

whisper samples/jfk.wav --model base

これだけです。最低限、入力ファイルとモデル指定を行えば実行してくれます。
入力ファイルは複数指定できます。
GutHubにはサンプルファイルなどは付属しておりませんので、適当な音声ファイルを見繕いましょう。

実行結果は下記のようになります。

/home/user/whisper/.venv/lib/python3.10/site-packages/whisper/transcribe.py:115: UserWarning: FP16 is not supported on CPU; using FP32 instead
  warnings.warn("FP16 is not supported on CPU; using FP32 instead")
Detecting language using up to the first 30 seconds. Use `--language` to specify the language
Detected language: English
[00:00.000 --> 00:11.000]  And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.

オプションで言語を指定していなかったため、自動的に言語が選択されています。

Detecting language using up to the first 30 seconds. Use `--language` to specify the language
Detected language: English

実際の文字起こし部分は下記。

[00:00.000 --> 00:11.000]  And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.

ちゃんとできていそうですね。

Whisperの実行オプション

whisper --help

でオプション一覧を表示できます。
よく使いそうなもののみ抜粋します。

--model MODEL         モデル選択 (default: small)
--device DEVICE       PyTorch inference (default: cpu)
--output_format       出力ファイル {txt,vtt,srt,tsv,json,all}, -f {txt,vtt,srt,tsv,json,all} (default:all)
--language            言語指定 en,ja, ... (default: None =Auto detect) 

入力ファイル

ファイルサイズに制限はありません。
(Whisper APIには25Mbの入力サイズ制限があります)
ファイルフォーマットは、wav以外にもmp3,flacなどある程度柔軟に扱えますが、ダメならffmpegで一旦読めるように変換しましょう。

ffmpeg -i video.mov -ar 16000 -ac 1 -c:a pcm_s16le output.wav

実際の会議の文字起こし

上記のようにごく短い、英語音声でのテストでは良好なように見えました。
ここから実際の会議を文字起こししていきましょう。
サンプルとして、公共機関で公開されている会議音声を利用してみます。
https://www.town.izumozaki.niigata.jp/gikai/chukei/
こちらは特に利用にあたっての制限が記載されておりませんので、ダウンロードして文字起こししてみます。
モデルは「small」で実施しました。

これから本日の会議を開きます 本日の時事日程はお手元に配布して
ましたとおりです よろしくご協力お願いします
日程第1 寝場第15号 子どもの目的観覧を求める寝場の
最低についてを議題とします
~~以下略~~

起こしてみると結構な文字数(9320文字)になりました。
精度に関しては、ミスは散見される(寝場→陳情?、最低→裁定?)ものの、割とよさそうに思います。

処理時間は数十分かかりました。30分程度の録音、smallモデルでこれほどかかりますので、
本格運用を考えるのであればGPU導入が必要になりそうです。

議事録化にトライ

さて、とりあえず議事録の元となる文章が出来ましたので、
まずは何も考えずChat-GPTにブラウザ上から流し込んでみましょう。
結論が見えるような状況まで持って行ければまずは上々です。

早速と行きたいところですが、
Chat-GPTは入力文字数制限があり、現時点では有料プランやAPIを利用しても完全に制限解除することは出来なさそうです。つまり、会議の文字起こしをそのまま流し込む事は出来ません。

こういった時の対策として、「処理をお願いしますというまで入力を受け付け続けてください」のような命令を入れて待たせるというテクニックがあります。
入力した文章は下記。

これから文章を渡すので、その内容を議事録としてマークダウン形式で出力してください。ただし文章は分割してあるので「作業してください」と伝えるまで、あなたは作業を始めず、代わりに「次の入力を待っています」と回答してください。

実際にやってみると、「待て」しきれずに処理が始まってしまったりと、入力時点でなかなか上手くいきません。
仕方がないので、一旦適当なところで打ち切り、議事録として出力させてみました。
(公開音声とはいえ、トラブル防止のため出力文章の掲載は割愛します。)
要約自体はまずまず、議事録としては少し物足りないピントがずれた感じになりました。
参加した人間が監修する必要がありそうです。
手放しではうまくいかない、とわかったところで課題を整理して今回はここまでとしたいと思います。

課題

まず、手動で分割した文章をブラウザ経由で放り込むのが面倒すぎます。
Ghat-GPTを利用する場合はAPIに変更し、適切な文章分割の上でスクリプトから投げ込むことは前提になるかと思います。
あるいは長文を受け入れられる他のサービスがあるかの調査が必要です。

議事録の精度も改善の余地があります。
ぱっと考えらる範囲では以下でしょうか。

  • 文字起こしをmedium以上のより高級なモデルで実施
  • 話者分離の実施
  • GPT-4化
  • 命令文の変更

一方、文字起こしはそれなりに満足できる結果になりました。
実運用だと処理時間と負荷が気になるところですので、機材の検討が必要になりそうです。

最後に

思い付きで挑戦してみた内容ですが、文字起こしまでは順調に進みました。
文章→議事録化が上手いこと処理できれば業務の補助ツールとして利用できるかもしれません。
もう少し実験を続けていきたいと思います。
成果がありそうでしたらまたこの場で公開できればと思います。

参考

About T.H

North Torch株式会社 プログラマ 技術的な経歴は.NETアプリケーションが一番長い。 その他はまだまだ勉強中。