🎙️

技術イベントのメモはOpenAI WhisperとGemini CLIに任せる

に公開

イベントの内容覚えてますか?

イベントに参加しても内容を覚えていることって少なくないですか?

イベントに参加しただけで満足して、特に生産的な活動に活かすことなく終わってしまうことがあると思います。また、登壇者の話を必死にメモしようとして、肝心な内容を聞き逃してしまうこともよくあります。

イベント参加は、個人的には学習のモチベーションアップに繋がるので良いのですが、せっかくなら学んだ内容をしっかり定着させたいと思いました。そこで、YouTubeや現地の音声を文字起こしして振り返りたいと考えたものの、理想的なツールが見つからなかったので自分で作ってみることにしました。

この記事では、OpenAIの音声認識モデル「Whisper」を使って、音声をリアルタイムで文字起こしする簡単な機能を自作したので紹介します。

マイクで音声を拾うところから、YouTubeの音声を文字起こしするところまで一通りやります。最後は、文字起こしした内容をAIで要約させてみます。

デモ

先にデモをお見せします。ChatGPTの音声読み上げを文字起こしします。

https://x.com/r4ynode/status/1947140671053463791

OpenAI Whisperとは

https://openai.com/ja-JP/index/whisper/

Whisperとは、OpenAIが開発した多言語対応の音声認識モデルで、音声から文字起こしをすることができます。インストール方法等は以下からどうぞ。

https://github.com/openai/whisper

WhisperはコマンドラインかPythonかの2通りの方法で使用できるようです。
今回はPythonで軽く実装します。

モデル

執筆時点(2025/07/20)で以下のモデルが公開されています。

サイズ パラメータ数 英語専用モデル 多言語モデル 必要VRAM 相対速度
tiny 39 M tiny.en tiny ~1 GB ~10x
base 74 M base.en base ~1 GB ~7x
small 244 M small.en small ~2 GB ~4x
medium 769 M medium.en medium ~5 GB ~2x
large 1550 M N/A large ~10 GB 1x
turbo 809 M N/A turbo ~6 GB ~8x

表を見ると、「large」モデルが最も高性能ですが、その分必要なVRAMも多く、動作が重くなりがちです。一方、「turbo」モデルは比較的軽量で処理速度も速いことが特徴です。

いくつかモデルを試しましたが、今回の用途においては、largeでないと十分に認識してくれませんでした。

voice2text

今回、音声を文字起こしするプロジェクト名を「voice2text」と名付けました。

要件

  • 学習目的で後から内容を振り返られるようにすること
  • 音声をリアルタイムで文字起こしすること

音声ファイルを一気に文字起こしするような利用は想定しません。あくまで、自分が学習しながら、リアルタイムで音声を文字起こしして、後で振り返れるようにします。

「自分が聞いていない音声 = 学習していない」のでそのような機能はつけません。

筆者の環境

  • MacBook
    • チップ:Apple M3 Max
    • メモリ:36GB
    • GPU:30コア
  • Python 3.12.4

実装

以下に実装があります。個人的に利用したいだけなのでパッケージ化はしてません。

https://github.com/r4ynode/voice2text

実行方法

git cloneして、requirements.txtに記載されたパッケージをインストールすれば実行できます。

main.pyを実行すると利用可能な音声入力デバイスの一覧が表示されます。入力とするデバイスの番号を求められるので数値を入力してください。

$ python main.py --output-path ./transcription.txt --model large
List of available devices
Device number 2: userのiPhoneのマイク (Input channels: 1)
Device number 3: BlackHole 2ch (Input channels: 2)
Device number 4: MacBook Proのマイク (Input channels: 1)
Device number 6: Microsoft Teams Audio (Input channels: 1)

Enter the device number to use for recording: 4
Selected device: MacBook Proのマイク
▶ Real-time transcription in progress...
Enter Ctrl+C to quit: 

2つの引数を指定できます。指定しなければデフォルト値が適用されます。

引数 説明 デフォルト
output-path 出力先 ./transcription.txt
model モデル名 large

設計の全体像

軽く設計について触れておきます。このプロジェクトは、音声をリアルタイムでテキストに変換するシステムです。構造は以下の通りです。

コンポーネント 主な役割・特徴
Recorder ・ユーザーが選択したマイクデバイスから音声を録音
・録音した音声データを audioQueue に渡す
AudioQueue ・スレッドセーフなキュー(queue.Queue)で録音データを一時的に保持
Transcriber ・別スレッドで audioQueue を監視
・データがあれば取り出してWhisperモデルでテキストに変換
・テキスト化した内容をファイルに保存

クラス図(簡易)

処理フロー

設計の利点

ちょっとした開発ですが、あとで変更しやすいように設計したつもりです。

  1. 疎結合・高い拡張性
    • 各コンポーネントが明確に分離しているため、例えば録音方法や音声認識モデルの変更も容易です。
  2. スレッドセーフなデータ受け渡し
    • audioQueue を介することで、録音と認識処理を非同期・並列で安全に実行できます。
  3. ユーザーインタラクション
    • 録音デバイスの選択が可能で、柔軟に環境へ対応できます。

AIを使って要約

文字起こしされた内容そのままでは、振り返るのに適していません。そこでAIを使って要約します。使用するAIツールは何でも良いですが、イベントによっては1時間近く話されることがあるため、文章が膨大になりがちです。膨大な文章を要約する際、AIツールの無料枠だと文字数制限に引っかかってしまいます。

そこで「Gemini CLI」がおすすめです。

無料で使えて、100万トークンまで利用できるので、長文の要約に使えます。なお、要約タスクであればモデルによる大きな差は出にくいので、ローカルLLMが使える方はそちらでも十分対応可能だと思います。私は学習されたくないものに関してはローカルLLMを使うようにしています。

YouTubeの文字起こし

オンラインイベントの場合、YouTubeで配信されていることもあると思います。Macの環境ではそのままでは録音できないので、仮想オーディオデバイスを使います。(Windowsでは別の方法があるかも知れませんが)

ちなみに、仮想オーディオデバイスを使うことで、YouTubeだけでなくデバイスから出力される音声ならすべてを拾うことができます。

  • YouTube
  • X (旧Twitter)
  • Slackのハドル
  • Google Meet (Geminiが要約してくれるので不要だが)
  • etc.

BlackHoleの導入

BlackHoleは、音声を仮想的にルーティング(転送)するためのソフトウェアです。これを使うことで、YouTubeの音声を直接録音することが可能になります。

https://existential.audio/blackhole/

1. BlackHoleのインストール

公式サイトからBlackHoleをダウンロードし、インストールします。

2. オーディオ設定

サウンド設定でBlackHoleを指定してしまうと、voice2textで音声は拾えますが、スピーカーに音声が出力されなくなってしまうため、音声をBlackHoleとスピーカーの両方に出力する設定を行います。

まず、Audio MIDI設定を開き、左下の「+」ボタンから「複数出力装置を作成」を選択し、BlackHoleとスピーカーを選択します。今回は名前を「ChromeToPython」で設定します。

audiosetting

システム環境設定から「サウンド」を開き、出力デバイスを先ほど作成した「ChromeToPython」に設定します。

soundsetting

3. 録音

main.pyを実行し、入力デバイスとして「BlackHole」を選択することで、YouTubeの音声を録音できます。

$ python main.py
List of available devices
Device number 3: BlackHole 2ch (Input channels: 2)

実際のイベントで使ってみた感想

オンラインとオフラインのイベントの両方に参加して使ってみました。オンラインイベントではBlackHoleを使い、オフラインイベントではMacBookのマイクを使いました。結果としては双方ともにそれなりに良い精度で文字起こしできました。

個人的には満足していますが、使っていく中で以下の課題が見つかりました。

  1. 電力消費が激しい
    • 1日がかりのイベントだと5時間程度しか持ちませんでした。
  2. BlackHoleを使うとデバイスの音量の調整ができなくなる
    • こればかりはBlackHoleの仕様っぽいので、別な仮想オーディオデバイスを探す必要がありそうです。
  3. 誰が喋ったかは認識できない
    • 複数人で喋るようなイベントだと、誰が何を喋ったかを認識できません。

まとめ

技術イベントのメモをするためにOpenAI Whisperを使って音声をリアルタイムで文字起こしをしてみました。課題は残るものの、個人的には概ね満足しています。興味があれば使ってみてください。

Discussion