話者分離できる無料の文字起こし|誰が話したかを自動で分ける方法

作成日2026年9月20日 7:58
"サムネイル画像"

会議やインタビューの録音をそのまま文字起こしすると、どの発言が誰のものか分からない一続きのテキストが出てきます。この文字起こしを発言者ごとに分ける処理が「話者分離」と呼ばれるもので、後から議事録として読み返すつもりなら、ここまで済ませておかないと結局は音声を聞き直すことになります。

ところが、文字起こしに広く使われている Whisper 自体にはこの機能がありません。無料で使えるクラウド型のサービスにも話者分離はありますが、月に使える時間が決まっているうえ、音声データをアップロードすることが前提になっています。

この記事では、ブラウザだけで話者分離つきの文字起こしをする手順を説明します。後半では、私がこの機能を実装したときに実際に測った精度と、どういう場面で精度が出ないのかも書きました。

  • 必要なもの — PC と、Chrome または Edge のブラウザ、会話が入った録音ファイル
  • 必要でないもの — 会員登録、アプリのインストール、ファイルのアップロード

話者分離とWhisperの関係 

「Whisper に話者分離の機能がある」と書かれているのを見かけますが、これは誤りです。Whisper は音声をテキストに変換するモデルであって、声の主を見分ける仕組みそのものを持っていません。

誰が話したかを分けるには、話者分離を専門にする別のモデルが必要です。この分野でよく使われるのが「pyannote.audio」で、音声を細かく区切って声の特徴をベクトルとして取り出し、似たベクトルどうしをまとめることで同じ人物の発言を復元していきます。

話者分離つきの文字起こしは、文字起こしのモデルと話者分離のモデルを組み合わせて成り立ちます。クラウド型のサービスはこの 2 つをどちらもサーバー側で動かすため、利用するには音声データをアップロードすることになります。

無料で話者分離する方法の比較 

無料でできる方法は大きく 3 つに分かれます。それぞれ準備にかかる手間も、扱えるファイルの大きさも、音声データがサーバーに送信されるかどうかも違いますので、先に並べて比べておきます。

方法

準備

時間の制限

サーバーへの送信

クラウド型のサービス

会員登録

無料枠は月 120〜300 分が目安

あり

Python で自分で組む

Python と GPU の環境構築

なし

なし

ブラウザの中で処理する

不要

なし

なし

Python で組む方法は自由度が高い反面、CUDA や ROCm の導入でつまずくことが多くあります。私も最初はこの経路で試していましたが、記事を読んだ人に毎回その環境を用意してもらうのは現実的ではないと考えて、同じ処理がブラウザの中だけで完結する形に作り直しました。

ここではブラウザで処理する手順を説明します。Python で自分で組むほうに興味があれば、環境構築から順に書いた記事を末尾に置いてあります。

手順:ブラウザで話者を分けて文字起こしする 

ここで使うのは私が作った「Transcriber」です。話者分離も文字起こしもブラウザの中で動きますので、録音した音声が端末の外へ出ることはありません。

無料・無制限のAI文字起こし|登録不要・アップロード不要 - Transcriber

音声・動画ファイルをブラウザだけで文字起こし。会員登録もアップロードも不要で、音声データは端末の外に出ません。時間・回数の制限なしで完全無料。Whisper AI による話者分離と SRT 字幕の書き出しに対応し、MP3・WAV・M4A・MP4 など主要形式を読み込めます。

favicontranscriber.tools.ryusei.io
  1. 「Transcriber」をブラウザで開きます。
  2. 「話者分離」を「有効」にします。
  3. 参加人数が分かっているなら「話者数(0 = 自動)」で指定します。
  4. 「モデル」と「言語」を選びます。
  5. 録音ファイルを枠に読み込ませます。読み込んだ時点で処理が始まります。

話者数を指定したほうが精度は上がる 

「話者数(0 = 自動)」を 0 のままにしておくと、何人が話しているかという推定から自動で行います。ただしこの推定は見た目より難しく、短い発言が何度も入れ替わるような録音では、実際には 2 人しかいない会話が 3 人に分かれてしまうことがあります。

私が実装したときの評価でも、30 秒の英語会話は自動判定だと 3 人になりました。人数を 2 と指定してしまえばこの誤りはそもそも起きないので、会議の参加者が分かっているなら指定したほうが確実です。

うまく分かれないときの直し方 

話者分離は完全ではありません。とくに短い発言では精度が落ち、1 秒前後の相づちや呼びかけは、その前後にある長い発言と同じ話者として扱われてしまいます。この弱点はモデルを変えても残るので、後から直す前提で使うほうが結果的に速く終わります。

国会の委員会の音源で調べたときは、「委員長、山井君。」のような短い呼び上げが 6 箇所あり、そのうち 4 箇所は音声を区切る最初の段階ですでに次の発言者と同じ扱いになっていました。まとめ方の問題ではなく、その手前の段階で区別が失われているので、閾値をどう動かしても直りません。

モデル側で直しきれない以上、後から人の手で直せることのほうが重要になります。そこで結果の画面には、行ごとに話者を変える、話者の名前を実名に変える、誤って分かれてしまった 2 人を統合する、長い行を途中で分割する、といった操作を用意してあります。

  • 話者バッジをクリックすると、名前の変更と別の話者への統合ができます
  • 行の話者だけを変えたいときは、その行のバッジから選び直します
  • 「話者の編集を元に戻す」で、話者の割り当てだけを戻せます(本文の編集は残ります)

仕組みと、実装したときに測った精度(エンジニア向け) 

ここからは内部ロジックの話になりますので、使うだけであれば読み飛ばしてもらって構いません。仕組みを知っておくと、なぜ短い発言で失敗するのかが分かり、結果を直すときの見当もつけやすくなります。

処理は 3 段階に分かれます。まず音声を 10 秒ずつに区切って、それぞれの区間の中で「いつ誰が話しているか」を推定します。次に、その区間ごとに話している人の声の特徴をベクトルとして取り出し、最後に似たベクトルどうしをまとめることで、録音全体を通して同じ人物の発言を復元します。

1 段目に使っているのは pyannote の区切り用モデル、2 段目は WeSpeaker ですが、区切り用のほうは 6 MB しかないため、ブラウザで読み込んでも待たされることはありません。処理の重さのほとんどは 2 段目の埋め込みと、その後のまとめ上げが占めています。

1人の独話が8人に割れていた話 

最初の実装には、声の特徴ベクトルから全体の平均を引くという処理を入れていました。録音ごとのマイクや部屋の違いを打ち消す狙いだったのですが、後から測ってみると、これが精度を下げる原因になっていました。

話者が 1 人しかいない録音で全体の平均を引くと、平均そのものがその人の声の特徴と一致するため、引いた結果には話者を区別する情報が残りません。2 人の場合も同じ人物どうしの距離がかえって広がり、手元のシミュレーションでは同一話者間の距離が 0.39 から 1.00 まで開いていました。

結果として、1 人だけが話している録音も 2 人の会話も、自動判定では上限である 8 人まで割れていました。まとめる際の閾値も実測せずに決めた値だったので、私は閾値をいじる前に、まず数字を出せる状態を作るところからやり直しています。

置き換えた後の実測 

pyannote 3.1 と同じ構成へ作り直したうえで、同じ音源を使って測り直しました。精度の指標には DER を使っています。これは「話者を取り違えていた時間が全体のどれくらいを占めるか」を表す値で、低いほど正確に分けられていることを意味します。

音源

旧実装(自動)

新実装(自動)

新実装(話者数を指定)

英語の会話 30 秒・2 人

8 人・DER 57.1%

2 人・5.1%

5.1%

日本語の独話 41 秒・1 人

8 人・80.3%

1 人・0.1%

上の会話を 25 回つないだ 12.5 分

2 人・5.9%

12.5 分まで伸ばしても DER が 5.9% に収まっているので、長い録音になったからといって急に精度が落ちることはありません。ただしこれは人手で正解ラベルを付けた 2 つの音源で測った値であって、どんな録音でもこの精度が出るという意味ではない点には注意してください。参加者が多い会議や、マイクから遠い発言が混ざる録音では、これより悪くなります。

pyannote をそのまま移しても精度は出なかった

pyannote の手順をそのまま持ってくると、30 秒のサンプルが 3 人に分かれました(DER 12.3%)。短い発言が重なる区間から互いに似たベクトルが大量に作られ、それらが実在しない 3 人目としてまとめられていたためです。

自動判定のときだけ、区間内の発話が 2 秒に満たないベクトルをクラスタの種から外すようにして解決しました。話者数を指定したときは外しません。

もう 1 つ手間だったのは、ブラウザ向けのライブラリが区切り用モデルの後処理を持っていなかったことです。このモデルは「誰と誰が同時に話しているか」という組み合わせの形で結果を出しますので、それを話者ごとの時間に戻す処理は、私が自分で書くしかありませんでした。

よくある質問 

何人まで分けられますか。

自動判定でも人数を指定する場合でも、上限は 8 人になります。参加者がそれより多い会議では分けきれず、声の近い人どうしが 1 人にまとまることがあります。

本当に無料ですか。回数の制限はありますか。

無料で使えます。回数の制限も時間の制限もありません。話者分離も文字起こしも利用者の PC の中で動いているので、こちら側にサーバーの費用が発生しないためです。

音声データがサーバーへ送られることはありませんか。

ありません。話者分離のモデルも文字起こしのモデルもブラウザの中で動きますので、音声が端末の外へ出ることはありません。通信が発生するのは、最初にモデルを取得するときだけです。

話者分離をすると処理はどれくらい遅くなりますか。

文字起こしとは別に、同じ音声をもう一度読み直すぶんの時間がかかります。WebGPU が使える環境なら文字起こしと同じくらいで済みますが、使えない環境ではそれより長くなります。

スマートフォンでも使えますか。

動きはしますが勧めません。話者分離は文字起こしとは別にメモリを使いますので、そのぶん途中で止まりやすくなります。録音はスマートフォンで行い、処理は PC で行ってください。

話者の名前を実名に変えられますか。

変えられます。話者バッジから名前を変更でき、そこで付けた名前は TXT や SRT として書き出したファイルにも反映されます。

まとめ 

Whisper だけを動かしても、誰が話したかは分かりません。話者分離はまったく別のモデルが担当する処理で、その 2 つを組み合わせれば、ブラウザの中だけでも議事録として読める形まで持っていけます。

  • 「話者分離」を有効にしてから音声ファイルを読み込ませる
  • 参加人数が分かっているなら指定する
  • 短い相づちや呼びかけは苦手なので、結果の画面で直す

関連記事とツール 

m4aファイルを文字起こしする方法|変換不要・アップロードなしでテキスト化 | Ryusei.IO

iPhoneのボイスメモなどで録音したm4aファイルを、形式を変換せずそのまま文字起こしする手順を説明します。ファイルのアップロードも会員登録も不要で、話者ごとの書き分けと字幕ファイルの書き出しまでブラウザだけで完結します。

faviconryusei.io
【完全無料】Pythonで高精度な文字起こしを無制限に行う方法 | Ryusei.IO

この記事では、Python言語を使って動画や議事録などの音声ファイルを完全無料でテキストへ文字起こしする方法を徹底解説します。多少Pythonプログラミングの知識があれば簡単に行えます。

faviconryusei.io
Xスペースの録音を文字起こしする方法|無料・登録不要でテキスト化する手順 | Ryusei.IO

X(旧Twitter)スペースの録音アーカイブを、無料でテキストに文字起こしする手順を解説します。録音のダウンロードから話者ごとの書き分け、字幕ファイルの書き出しまで、会員登録もアプリのインストールもなしにブラウザだけで完結します。

faviconryusei.io

Latest Tips