この記事は、CYBOZU SUMMER BLOG FES '25の記事です。
はじめに
PSIRTの北村です。
突然ですが皆さん、海外カンファレンスに参加した際に、リアルタイムで発表内容をどのくらい理解することができますか? 僕はというと、スライドに情報が盛り込まれていればある程度理解できるものの、5割聞き取れれば良い方で、パネルディスカッションは特に大変、というぐらいの英語力です。
このような状態の中、今年は2回も海外カンファレンスに出張する機会に恵まれ、発表内容の理解や社内への素早い議事録共有をするために工夫した方法について共有しようと思います。
モチベーション
海外カンファレンス参加の費用、高いですよね。
チケット代や飛行機、宿泊費を合わせると、それなりの額になることは明らかです。
そのような中で、せっかく会社のサポートを受けて参加するなら、個人の学びとチームへの還元の最大化をしたいのが1番のモチベーションでした。
ただ、議事録を取るのは日本語でも大変なのに、僕の英語力では議事録として伝えられる情報は良くても2割とか3割になりかねません。
これではチームへ共有できる情報がかなり落ちてしまいます。
そこで、(めんどくさいことは)AIにすべて任せてしまおうという発想になりました。
構成
今回議事録作成を支えてくれた技術は大きく以下の3つの要素に分かれます。 (よりよい構成や方法はありそうに思います)
- VoiceMemos(Mac純正アプリ)
- Whisper
- ChatGPT
VoiceMemos
[!!NOTE!!] 発表によっては録音が禁止されているものもあります。そのため無闇に全ての発表で録音しないように気をつける必要があります。
録音に使用します。
エクスポートがイマイチわからず、finderに表示すると~/Library/Containers/com.apple.VoiceMemos/Data/tmp にランダムな文字列を含むディレクトリ以下に一時ファイルとして出力される挙動を利用してファイルの書き出しを行いました。
(本当はもっと筋の良い方法があるような...)


Whisper
ローカルで文字起こしをするために使用します。 VoiceMemosで録音したファイルをいちいちエクスポートしたり名前をつけるのは手間なので、以下のシェルスクリプトでテキストファイル(.txt)に書き出します。 VoiceMemosから吐かれるのはm4aファイルなのですが、Whisper.cppでサポートしていないため、ffmpegでwavファイルに変換してからwhisperへ渡しています。 指定しているオプションとかはChatGPT頼りです。(AIさんありがたい...)
#!/bin/bash set -euC # VoiceMemosの一時ディレクトリのパス BASE_DIR="~/Library/Containers/com.apple.VoiceMemos/Data/tmp" echo "=== 検出されたランダムディレクトリの一覧 ===" random_dirs=() for folder in "${BASE_DIR}"/.com.apple.uikit.itemprovider.temporary.*; do if [ -d "$folder" ]; then echo "$folder" random_dirs+=("$folder") fi done if [ ${#random_dirs[@]} -eq 0 ]; then echo "エラー: ランダムディレクトリが見つかりませんでした。" exit 1 fi # 各ランダムフォルダを順次処理 for folder in "${random_dirs[@]}"; do echo "-------------------------------------------" echo "フォルダを処理中: $folder" # フォルダ直下の.m4aファイルを探索(最初の1件) m4a_file=$(find "$folder" -maxdepth 1 -type f -name "*.m4a" | head -n 1) if [ -z "$m4a_file" ]; then echo "警告: このフォルダ内に.m4aファイルが見つかりません: $folder" continue fi echo "見つかった.m4aファイル: $m4a_file" # ファイル名(拡張子なし)の取得 base=$(basename "$m4a_file" .m4a) # カレントディレクトリに同名の.m4aファイルが存在するかチェック if [ -f "${base}.m4a" ]; then echo "スキップ: カレントディレクトリに ${base}.m4a が既に存在します。" else echo "処理開始: ${base}.m4a をカレントディレクトリにコピーします。" cp "$m4a_file" . echo "コピー完了: $(pwd)/${base}.m4a" echo "ffmpegによる変換開始: ${base}.m4a を ${base}.wav に変換中..." ffmpeg -i "${base}.m4a" -ar 16000 -ac 1 -c:a pcm_s16le "${base}.wav" echo "変換完了: $(pwd)/${base}.wav" echo "whisper-cli実行開始: ${base}.wav の音声認識処理中..." whisper-cli -m ~/tools/whisper.cpp/models/ggml-large-v3-turbo.bin -f "${base}.wav" -l en --output-txt -pc --threads 12 echo "whisper-cli処理完了: テキスト出力ファイルが生成されました。" fi done echo "=== すべての処理が完了しました ==="
これでVoiceMemosの録音データをfinderに表示さえすれば、あとはターミナルで./main.shを実行すれば、<filename>.wav.txtが生成されます。

ChatGPT
文字起こしをした後のテキストファイルと以下のプロンプトを入力し、Confluenceに直接転記できるように、markdown形式で出力させます。この辺りは全然ちゃんとプロンプトエンジニアリングをしていないので、もう少し良い書き方ができると思います。あと平気でルール破るので、その時は対話を繰り返すとなんとかなります。
markdownでコピペできるように議事録を作成して。 概要は不要で書かれている内容の詳細も省かずにできる限り記述するようにして。 markdownがレンダリングされないように、ソースコードとしてmarkdownの議事録を作成して。 各項目にナンバリングは不要。太文字の装飾も不要。議事録は日本語で作成して。 技術用語は、カタカナではなく英語のまま表記するようにして。繰り返すが技術用語は英単語で表記すること。 基本的にカタカナは全部英語にすること。簡単なもの(ユーザ)はカタカナでよい。箇条書きに句点は基本的に不要。 セクションも作成して「##」を使ってわかりやすく構造化して。 また、参考情報として、一部のスライドの各ページのタイトルを以下に載せるので対応できそうなところは対応させて欲しいが、必ずしも従う必要はない。 まとめの参考程度に使ってもらえれば良い。各ページのタイトルで使用されているtechnical termは本文にも反映させて英語を用いて記述して。

ちなみにモデルは一番最初にこの議事録作成方法を使ったのが、GPT-5が出る前だったので4oを使っています。o3,o4などは推論を重ねた結果、原文と異なる形でまとめてくるので議事録としてはあまり使えませんでした。 投げるプロンプトが悪かったのかもしれません。 あとは、単純に推論時間が長いので、4oだとさっと仕上げてくれてちょうどよかったです。
BSidesLV, DEFCONの時にはちょうどGPT-5が出た直後ぐらいだったので使用しましたが、GPT-5もいい感じに使用できました。
この方法を取る利点
素早い共有ができる
シンガポールでのBlackhat Asia 2025に参加した際は、時差が1時間しかないので、リアルタイムで議事録をまとめて、スライドの写真を貼ったり、自身のコメントを書いて社内に共有していました。 これにより、日本にいる参加していないメンバーへ会場の温度感が伝わったように思います。
最近のカンファレンスでは録画が公開されたりするのですが、参加している当事者の熱量をそのまま分報に書き込むことで情報の鮮度を第一に伝えることを心がけていました。 また、PSIRTメンバーに限らず、プロダクトメンバーにもセキュリティカンファレンスの内容や温度感が伝われば会社全体として、セキュリティに興味を持ってもらうきっかけになればとも考えていました。
自身の理解につながる
ChatGPTに音声の文字起こしを読み込ませるので、発表のコンテキストを理解させつつ、自身のわからない箇所などをそのまま聞くことができます。 移動中やスキマ時間にChatGPTと壁打ちすることで自身の理解を整理でき、思わぬ利点となりました。
体力温存できる
海外で慣れない環境の中、異なる言語を聞き理解するのは大変疲れるものだと思います。 その中で聴講のハードルだけでもできるだけ下げておくと、他の参加者との交流に使える体力が残ったりと、聴講だけでぐったりすることを防げます。 実際、議事録を全力で取ることをカンファレンス期間中繰り返していたら、相当憔悴しきってしまうと思います。
最後に
セキュリティカンファレンス参加に伴い、工夫したポイントについて紹介しました。 内容としてはセキュリティに関係するものではないですが、事業会社のセキュリティを担当するPSIRTメンバーとして、プロダクトメンバーへ少しでもセキュリティに興味をもっていただける機会になればと思い、素早く議事録を社内に共有していました。 海外カンファレンスに参加する目的は様々かと思いますが、何か参考になれば幸いです。
また、サイボウズでは一緒に働くメンバーも募集しています。PSIRTでは、キャリア採用、27新卒採用ともにオープンしていますので、ぜひご興味あればご応募ください!