guess_speaker.py 技術ドキュメント
プログラムの動作
guess_speaker.py は、OpenAI の GPT モデルと Function Calling 機能を利用して、文字起こしされた会話テキストを整形し、話者を推測するPythonプログラムです。主に以下の機能を提供します。
テキストの整形: 入力された会話テキスト内の誤字や誤訳を訂正し、読みやすいように文ごとに改行を挿入します。
話者の推測: 会話の内容から登場する話者を推測し、各発言に推測された話者名を付与します。
構造化された出力: 整形されたテキストと推測された話者情報を
[話者名]: 発言テキストという形式でファイルに保存します。
このプログラムは、特に半導体・材料科学分野の講義録など、専門的な内容を含む音声認識結果の品質向上と可読性向上を目的としています。
原理
本プログラムの主要な原理は、大規模言語モデル (LLM) であるOpenAIのGPTモデルと、その拡張機能であるFunction Callingの利用に基づいています。
言語モデルによるテキスト処理: プログラムは、システムプロンプトとして「あなたは半導体・材料科学の教授です。以下の講義の会話テキストには誤字・誤訳が多くあります。次の作業をしてください。1.誤字・誤訳を訂正する2.読みやすいように文ごとに改行を入れる3.話者を推測する」という指示をGPTモデルに与えます。これにより、モデルは専門分野の知識を持ち、与えられたタスクを遂行するよう振る舞います。ユーザーからの入力テキストは、このプロンプトに従って誤字訂正、誤訳修正、および文ごとの改行処理が行われます。
Function Calling による話者推測と構造化: GPTモデルのFunction Calling機能は、モデルが特定の形式で構造化されたデータを出力するために使用されます。プログラムは、
guess_speakersという名前の仮想関数を定義し、その入力として期待されるJSONスキーマをGPTモデルに提示します。このスキーマは以下の構造を要求します。{ "name": "guess_speakers", "description": "会話のテキストから話者を推測し、JSON 構造で返す", "parameters": { "type": "object", "properties": { "speakers": { "type": "array", "items": {"type": "string"} }, "turns": { "type": "array", "items": { "type": "object", "properties": { "speaker": {"type": "string"}, "text": {"type": "string"} }, "required": ["speaker", "text"] } } }, "required": ["speakers", "turns"] } }
このスキーマにより、GPTモデルはテキストを処理した後、推測した話者のリスト (
speakers) と、各発言 (text) を行った話者 (speaker) を含むターンのリスト (turns) をJSON形式で出力するように誘導されます。プログラムは、GPTモデルが生成したJSONデータを受け取り、それを解析して[話者名]: 発言テキストの形式に変換し、最終的な出力ファイルに保存します。
このように、GPTモデルの自然言語処理能力とFunction Callingの構造化出力能力を組み合わせることで、生テキストから整形され、話者情報が付与された高品質な会話ログを生成します。
必要な非標準ライブラリとインストール方法
このプログラムの実行には、以下の非標準Pythonライブラリが必要です。
python-dotenvopenai
これらのライブラリは pip コマンドを使用してインストールできます。
pip install python-dotenv openai
必要な入力ファイル
プログラムの実行には、以下のファイルが必要です。
環境変数設定ファイル (
translate.envおよびaccounts.env):ファイル名:
translate.env(デフォルトパス: スクリプトと同じディレクトリ)accounts.env(デフォルトパス: スクリプトと同じディレクトリ、translate.env内でaccount_inf_pathを設定することで変更可能)
形式: Key=Value形式のプレーンテキストファイルです。
内容: OpenAI APIキー、使用するモデル名、その他の設定が含まれます。
translate.envの例:# translate.env # account_inf_path = /path/to/your/accounts.env # 必要であれば指定 openai_model = gpt-4o temperature = 0.3 max_tokens = 2000
accounts.envの例 (通常はこちらにAPIキーを記述します):# accounts.env OPENAI_API_KEY = your_openai_api_key_here
重要:
OPENAI_API_KEYは必ず設定してください。
入力テキストファイル (例:
transcript.txt):ファイル名: デフォルトでは
transcript.txtですが、コマンドライン引数で任意のテキストファイルを指定できます。形式: プレーンテキストファイル。
内容: 音声認識などによって生成された、話者の区別がなく、誤字・誤訳を含む可能性のある会話の文字起こしテキスト。
transcript.txtの内容例:あーこんにちは。今日は半導体の基礎について話します。まずバンド構造からですね。えっと、半導体っていうのは、その、電気的な特性が、その、ドーピングによって変わるっていうのが重要です。ドーピングですね。はい。それで、その、ドーピングの、あの、種類によって、N型とかP型とかありますね。なるほど、N型とP型ですね。それで、その、N型半導体っていうのは、えーと、電子が多数キャリアになります。はい。で、P型半導体は、正孔が多数キャリアになります。はー、なるほど。
生成される出力ファイル
プログラムは、実行時に以下のファイルを生成または更新します。
話者情報付きテキストファイル:
ファイル名: デフォルトでは、入力ファイル名に
_with_speakers.txtを付加したファイル名になります(例:transcript_with_speakers.txt)。コマンドライン引数で出力ファイル名を指定することも可能です。形式: プレーンテキストファイル。
内容: GPTモデルによって誤字・誤訳が訂正され、読みやすいように改行が挿入され、さらに推測された話者情報が
[話者名]: 発言テキストの形式で付与された会話ログ。transcript_with_speakers.txtの内容例:[Speaker A]: こんにちは。今日は半導体の基礎について話します。 [Speaker A]: まずバンド構造からですね。 [Speaker A]: 半導体というのは、電気的な特性がドーピングによって変わるというのが重要です。 [Speaker A]: ドーピングですね。 [Speaker B]: はい。 [Speaker A]: それで、ドーピングの種類によって、N型とかP型とかありますね。 [Speaker B]: なるほど、N型とP型ですね。 [Speaker A]: それで、N型半導体というのは、電子が多数キャリアになります。 [Speaker B]: はい。 [Speaker A]: で、P型半導体は、正孔が多数キャリアになります。 [Speaker B]: はー、なるほど。
コマンドラインでの使用例 (Usage)
guess_speaker.py は、以下の形式でコマンドラインから実行できます。
python guess_speaker.py [input_file] [output_file] [max_bytes]
[input_file](必須): 処理する入力テキストファイルのパス。デフォルトは
transcript.txtですが、通常はこの引数で明示的に指定します。
[output_file](任意): 生成される出力テキストファイルのパス。指定しない場合、入力ファイル名に
_with_speakers.txtが付加されたファイル名が使用されます。
[max_bytes](任意): GPTに送信する入力テキストの最大バイト数(整数値)。デフォルトは
20000バイトです。長いテキストを処理する際に、APIの入力制限やコストを考慮して調整できます。
コマンドラインでの具体的な使用例
以下の例では、sample_transcript.txt という名前の入力ファイルを使用します。
1. 入力ファイルの準備 (sample_transcript.txt)
こんにちは。今日のテーマは半導体のドーピングについてです。半導体デバイスは我々の日常生活に不可欠です。ドーピングによって、その電気的特性を精密に制御できます。N型ドーピングでは自由電子が増え、P型ドーピングでは正孔が増えます。これらのキャリアが電流を流す役割をします。質問はありますか?はい、N型半導体とP型半導体は、具体的にどのような応用で使われているのでしょうか?良い質問です。N型半導体はトランジスタやダイオードのN領域に、P型半導体はP領域に使われます。これらが組み合わさって、様々な半導体素子が作られます。
2. コマンドの実行
出力ファイル名を指定せず、デフォルトの最大バイト数で実行します。
python guess_speaker.py sample_transcript.txt
3. 実行結果の説明
上記のコマンドを実行すると、以下のような情報がコンソールに表示された後、sample_transcript_with_speakers.txt というファイルが生成されます。
config_path: translate.env
account_inf_path: accounts.env
Guess speakers from text file
api_key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
input_path : sample_transcript.txt
output_path : sample_transcript_with_speakers.txt
guess_speakers: 1
openai_model: gpt-4o
temperature : 0.3
max_tokens : 2000
max_bytes : 20000
Sending request to ChatGPT:
[Speaker A]: こんにちは。今日のテーマは半導体のドーピングについてです。
[Speaker A]: 半導体デバイスは我々の日常生活に不可欠です。
[Speaker A]: ドーピングによって、その電気的特性を精密に制御できます。
[Speaker A]: N型ドーピングでは自由電子が増え、P型ドーピングでは正孔が増えます。
[Speaker A]: これらのキャリアが電流を流す役割をします。
[Speaker A]: 質問はありますか?
[Speaker B]: はい、N型半導体とP型半導体は、具体的にどのような応用で使われているのでしょうか?
[Speaker A]: 良い質問です。
[Speaker A]: N型半導体はトランジスタやダイオードのN領域に、P型半導体はP領域に使われます。
[Speaker A]: これらが組み合わさって、様々な半導体素子が作られます。
話者推測結果を 'sample_transcript_with_speakers.txt' に保存しました。
Press ENTER to terminate>>
4. 生成される出力ファイル (sample_transcript_with_speakers.txt) の内容
[Speaker A]: こんにちは。今日のテーマは半導体のドーピングについてです。
[Speaker A]: 半導体デバイスは我々の日常生活に不可欠です。
[Speaker A]: ドーピングによって、その電気的特性を精密に制御できます。
[Speaker A]: N型ドーピングでは自由電子が増え、P型ドーピングでは正孔が増えます。
[Speaker A]: これらのキャリアが電流を流す役割をします。
[Speaker A]: 質問はありますか?
[Speaker B]: はい、N型半導体とP型半導体は、具体的にどのような応用で使われているのでしょうか?
[Speaker A]: 良い質問です。
[Speaker A]: N型半導体はトランジスタやダイオードのN領域に、P型半導体はP領域に使われます。
[Speaker A]: これらが組み合わさって、様々な半導体素子が作られます。
この例では、プログラムが会話の内容に基づいて2人の話者(Speaker A、Speaker B)を適切に推測し、各発言に話者名を付与して整形されたテキストを出力しています。