Created
February 14, 2026 05:31
-
-
Save ruoyu0088/05486014115990cff12a67b340e8b446 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "id": "4fffd62f-29a3-41d5-81b7-7a9e9fa17ae6", | |
| "metadata": {}, | |
| "source": [ | |
| "# オープンソースで話者分離と文字起こし" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "5aa91c44-ad47-4375-9a51-3bc33945f115", | |
| "metadata": {}, | |
| "source": [ | |
| "* https://github.com/pyannote/pyannote-audio\n", | |
| "* https://github.com/openai/whisper\n", | |
| "\n", | |
| "音声データ: https://youtu.be/akzWPN-ygCw?si=ZI9GObwtgyyWMNeK" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "id": "acb4cdb8-b799-4228-8b02-1f03f4a39ea9", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import torch\n", | |
| "from pyannote.audio import Pipeline\n", | |
| "from pyannote.audio.pipelines.utils.hook import ProgressHook\n", | |
| "import polars as pl\n", | |
| "import whisper\n", | |
| "import textwrap" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "806d9556-355d-4ec4-bc00-094fe7a966cc", | |
| "metadata": {}, | |
| "source": [ | |
| "## MP3をWAVに変換" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "id": "73655880-f493-40e2-936d-d9679eb0543c", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "from pathlib import Path\n", | |
| "mp3_fn = \"2.mp3\"\n", | |
| "wav_fn = str(Path(mp3_fn).with_suffix(\".wav\"))\n", | |
| "!ffmpeg -i {mp3_fn} {wav_fn}" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "a969a88a-4cfd-4718-b50b-97108ef6f3af", | |
| "metadata": {}, | |
| "source": [ | |
| "## 話者分離" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "id": "33417151-633e-409c-a262-b4eb92e54fca", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "application/vnd.jupyter.widget-view+json": { | |
| "model_id": "15e18a92c44b4ac0aebedd5252c073be", | |
| "version_major": 2, | |
| "version_minor": 0 | |
| }, | |
| "text/plain": [ | |
| "Output()" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">C:\\py_audio2\\.venv\\Lib\\site-packages\\pyannote\\audio\\utils\\reproducibility.py:74: ReproducibilityWarning: \n", | |
| "TensorFloat-32 (TF32) has been disabled as it might lead to reproducibility issues and lower accuracy.\n", | |
| "It can be re-enabled by calling\n", | |
| " >>> import torch\n", | |
| " >>> torch.backends.cuda.matmul.allow_tf32 = True\n", | |
| " >>> torch.backends.cudnn.allow_tf32 = True\n", | |
| "See https://github.com/pyannote/pyannote-audio/issues/1370 for more details.\n", | |
| "\n", | |
| " warnings.warn(\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "C:\\py_audio2\\.venv\\Lib\\site-packages\\pyannote\\audio\\utils\\reproducibility.py:74: ReproducibilityWarning: \n", | |
| "TensorFloat-32 (TF32) has been disabled as it might lead to reproducibility issues and lower accuracy.\n", | |
| "It can be re-enabled by calling\n", | |
| " >>> import torch\n", | |
| " >>> torch.backends.cuda.matmul.allow_tf32 = True\n", | |
| " >>> torch.backends.cudnn.allow_tf32 = True\n", | |
| "See https://github.com/pyannote/pyannote-audio/issues/1370 for more details.\n", | |
| "\n", | |
| " warnings.warn(\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">C:\\py_audio2\\.venv\\Lib\\site-packages\\pyannote\\audio\\models\\blocks\\pooling.py:103: UserWarning: std(): degrees of \n", | |
| "freedom is <= 0. Correction should be strictly less than the reduction factor (input numel divided by output \n", | |
| "numel). (Triggered internally at \n", | |
| "C:\\actions-runner\\_work\\pytorch\\pytorch\\pytorch\\aten\\src\\ATen\\native\\ReduceOps.cpp:1857.)\n", | |
| " std = sequences.std(dim=-1, correction=1)\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "C:\\py_audio2\\.venv\\Lib\\site-packages\\pyannote\\audio\\models\\blocks\\pooling.py:103: UserWarning: std(): degrees of \n", | |
| "freedom is <= 0. Correction should be strictly less than the reduction factor (input numel divided by output \n", | |
| "numel). (Triggered internally at \n", | |
| "C:\\actions-runner\\_work\\pytorch\\pytorch\\pytorch\\aten\\src\\ATen\\native\\ReduceOps.cpp:1857.)\n", | |
| " std = sequences.std(dim=-1, correction=1)\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n" | |
| ], | |
| "text/plain": [] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "pipeline = Pipeline.from_pretrained(\n", | |
| " \"pyannote/speaker-diarization-community-1\",\n", | |
| " token=\"hf_AKveW.....\")\n", | |
| "\n", | |
| "pipeline.to(torch.device(\"cuda\"))\n", | |
| "\n", | |
| "with ProgressHook() as hook:\n", | |
| " output = pipeline(wav_fn, hook=hook) # runs locally" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "id": "c3c7450e-9059-4467-a53b-08cc19ec2f33", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "rows = []\n", | |
| "for turn, speaker in output.speaker_diarization:\n", | |
| " rows.append((speaker, turn.start, turn.end))\n", | |
| "df_speaker = pl.DataFrame(rows, schema=['speaker', 'start', 'end'], orient=\"row\")\n", | |
| "df_speaker = df_speaker.group_by(pl.col(\"speaker\").rle_id().alias(\"group\"), maintain_order=True).agg(\n", | |
| " pl.col(\"speaker\").first(),\n", | |
| " pl.col(\"start\").min(),\n", | |
| " pl.col(\"end\").max()\n", | |
| ")\n", | |
| "df_speaker.write_parquet(\"speaker.parquet\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "b974a705-0759-4ad0-8390-8112dc96b278", | |
| "metadata": {}, | |
| "source": [ | |
| "## 音声認識" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "id": "6bc5b747-f273-4a8a-aac7-58280c85d67b", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "model = whisper.load_model(\"large\")\n", | |
| "result = model.transcribe(mp3_fn)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "id": "27f9b1f5-b866-4aa5-beba-50eb292886b6", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "df_segments = pl.DataFrame(result['segments'])\n", | |
| "df_segments.write_parquet(\"segments.parquet\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "45b1c0af-959b-4601-a58a-537035f7fed2", | |
| "metadata": {}, | |
| "source": [ | |
| "## 出力" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "id": "cf86d093-edcd-44c4-8906-47b8d3dddcdb", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "次は保険に関する会話の録音から音声認識で生成した文です。\n", | |
| "この文の認識の誤りを訂正してください。文書には適切な句読点もつけてください。\n", | |
| "話者を間違う可能性もあるので、例えば、文には一つの話者の発言ですが、実際は違う可能性もあります。\n", | |
| "その場合修正してください。\n", | |
| "修正は最低限にしてください。ほんとに音声認識の間違い、言葉は通じないところだけを修正してください。\n", | |
| "出力するときは、話者はSPEAKER_**ではなく、話者の名前で会話を生成してください。\n", | |
| "\n", | |
| "\n", | |
| "SPEAKER_02: お電話ありがとうございます。丸山でございます。\n", | |
| "\n", | |
| "SPEAKER_01: 事故っちゃったんだけど。\n", | |
| "\n", | |
| "SPEAKER_02: はい、あのお体は大丈夫ですか?\n", | |
| "\n", | |
| "SPEAKER_01: あの、怪我はしてるかどうか置いといて、体は痛いですよ。\n", | |
| "\n", | |
| "SPEAKER_02: あ、かしこまりました。ではご契約内容を確認したいので、おそれ入ります。\n", | |
| "\n", | |
| "SPEAKER_01: お車のナンバーですとか。\n", | |
| "\n", | |
| "SPEAKER_02: 車のナンバー。車のナンバーは松本さんさん、ん。 うさぎのうでよろしいですか?\n", | |
| "\n", | |
| "SPEAKER_01: 違います。ん、松本さんさん、ん、1777です。\n", | |
| "\n", | |
| "SPEAKER_02: ナンバーが最後4桁、1777でございますね。\n", | |
| "\n", | |
| "SPEAKER_01: そうです。\n", | |
| "\n", | |
| "SPEAKER_02: おそれ入ります。お名前も教えていただけますか?\n", | |
| "\n", | |
| "SPEAKER_01: あ、名前、名前は加藤です。\n", | |
| "\n", | |
| "SPEAKER_02: 加藤様ですね。いつもお世話になっております。 ご契約確認できました。 はい。 お車、アテンザでいらっしゃいますね。\n", | |
| "\n", | |
| "SPEAKER_01: 違いますよ。\n", | |
| "\n", | |
| "SPEAKER_02: ナンバーとお名前で消防。\n", | |
| "\n", | |
| "SPEAKER_01: 本当?あ、じゃあこの車アテンザ。\n", | |
| "\n", | |
| "SPEAKER_02: アテンザっていうのか。じゃあそうですね、アテンザですわ。 こちらのお車にお乗りの際に事故に遭われたということですね。\n", | |
| "\n", | |
| "SPEAKER_01: そうそうそう。 事故は必要でしょうか? 完全にもらい事故ですわ。\n", | |
| "\n", | |
| "SPEAKER_02: あ、もらい事故。\n", | |
| "\n", | |
| "SPEAKER_01: はい。\n", | |
| "\n", | |
| "SPEAKER_02: はい。\n", | |
| "\n", | |
| "SPEAKER_01: いつっていうのがね、今さっき。 本日でございますね。 ではおそれ入ります。事故の時の状況を教えていただけますか?\n", | |
| "えっとね、赤信号でね、止まってたんですよ、前の車が。 はい。 そこに後ろから突っ込んでたんですよ。\n", | |
| "で、それでぶつかったっていう、完全にもらい事故。\n", | |
| "\n", | |
| "SPEAKER_02: 状況を確認いたしますね。 前の信号が赤の状態で、加藤様の前に車がいて、その車にぶつかってしまったということで。\n", | |
| "\n", | |
| "SPEAKER_01: そうだよ。そうです。そうそう、そういうことですよ。\n", | |
| "\n", | |
| "SPEAKER_02: 車のぶつかった箇所としますと、加藤様がお乗りの車の前、あのボンネットですとか。\n", | |
| "\n", | |
| "SPEAKER_00: そうね、そう。 今壊れてらっしゃる。 はい。\n", | |
| "\n", | |
| "SPEAKER_02: はい。で、前にいた車はバンパーですとか、後ろのハッチバックのドアだとか、そういうところが壊れてるんですか?\n", | |
| "\n", | |
| "SPEAKER_01: ええ、まあまあ。 そうですよ。 はい。\n", | |
| "\n", | |
| "SPEAKER_02: かしこまりました。 警察への届け出は?\n", | |
| "\n", | |
| "SPEAKER_01: まあ、届け出してますよ。\n", | |
| "\n", | |
| "SPEAKER_02: ありがとうございます。 とにかくさ、本当にもうひどい話でさ、なんで前に止まってるんだっていう話ですよ。\n", | |
| "加藤様とすると、そんなところに車が止まっていたので、ぶつかった。\n", | |
| "\n", | |
| "SPEAKER_01: そりゃそうでしょ。 明らかにあんなとこで止まってる方が悪いんだから。\n", | |
| "赤信号で止まっていたっていうことなんですけれども、前にいた車は1台だけですか? そうですね。\n", | |
| "\n", | |
| "SPEAKER_02: 1台だけ。 はい。 前の車というのは信号機の手前で止まっていたという。\n", | |
| "\n", | |
| "SPEAKER_01: そりゃそうでしょ。\n", | |
| "\n", | |
| "SPEAKER_02: はい。それ、いります。加藤様、信号が赤だというのはどの時点でお気づきになられましたか?\n", | |
| "\n", | |
| "SPEAKER_01: ぶつかる直前じゃないかな。\n", | |
| "\n", | |
| "SPEAKER_02: ぶつかる直前、はい。ぶつかる直前に信号が赤だということに気がついたということですね。\n", | |
| "\n", | |
| "SPEAKER_01: そう。\n", | |
| "\n", | |
| "SPEAKER_02: 体感でいいんですけれども、どのくらい手前でお気づきになられましたか?\n", | |
| "\n", | |
| "SPEAKER_01: ぶつかる直前に…。 気づきになった時に気がついて、ブレーキかけても遅かったんだよね。\n", | |
| "\n", | |
| "SPEAKER_02: はい。赤信号だったり前の車に気がつかれたのがもう本当に交差点の信号機のところの直前だったということなんですけれども、お気を悪くされたら申し訳\n", | |
| "ありません。 ちょっとぼんやりしてしまったとか、眠くなってしまったとかってそういうことはないかもしれません。\n", | |
| "ぼんやりなんかしてないですよ。眠くもないですよ。 はい。気づきになるのが遅くなってしまった理由があったらお聞かせいただきたいんですけれども。\n", | |
| "\n", | |
| "SPEAKER_01: 急に赤になったからじゃない?\n", | |
| "\n", | |
| "SPEAKER_02: 急に赤になったからじゃない?\n", | |
| "\n", | |
| "SPEAKER_01: 急に止まったんじゃない?\n", | |
| "\n", | |
| "SPEAKER_02: 何キロぐらいで速度を出されていたかを覚えて…。\n", | |
| "\n", | |
| "SPEAKER_01: 速度?速度15キロぐらいじゃない?\n", | |
| "\n", | |
| "SPEAKER_02: 15キロぐらい。本当にもうゆっくりのろのろ…。\n", | |
| "\n", | |
| "SPEAKER_01: もう歩くスピードぐらいですよ。\n", | |
| "\n", | |
| "SPEAKER_02: それでも気がついた時には目の前が赤信号で、目の前に車がいて、ブレーキも間に合わなかったということですね。\n", | |
| "\n", | |
| "SPEAKER_01: そうですよ。私も目の前ばっちり目を開けて見てましたからね。突然現れましたよ。\n", | |
| "\n", | |
| "SPEAKER_02: 突然現れましたか。 はい。 車の後ろに合われた時のお天気っていかがでしたか?\n", | |
| "\n", | |
| "SPEAKER_01: 天気は晴れ。\n", | |
| "\n", | |
| "SPEAKER_02: 見通しが悪かったということはないですか?\n", | |
| "\n", | |
| "SPEAKER_01: 見通しは悪かったかな。 悪かったですか? 悪かったかな。\n", | |
| "\n", | |
| "SPEAKER_02: 道路はまっすぐな道路ですか?\n", | |
| "\n", | |
| "SPEAKER_01: まっすぐなようで曲がっているのかな。人生と同じだよね。\n", | |
| "\n", | |
| "SPEAKER_02: さようでございますか。警察の方から何か言われませんでした?\n", | |
| "\n", | |
| "SPEAKER_01: なんかよく分からないことを言ってますよ。\n", | |
| "\n", | |
| "SPEAKER_02: 前に乗ってた方の名前とか連絡先って覚えてらっしゃいますか?\n", | |
| "\n", | |
| "SPEAKER_01: 覚えてないよ。頭打ったんだもん。\n", | |
| "\n", | |
| "SPEAKER_02: 覚えてない。かしこまりました。お相手の方とはそのままその場で別れてそれっきりでいらっしゃいますか?\n", | |
| "\n", | |
| "SPEAKER_01: それっきりってことはないですよ。だってこれからいろいろあるでしょ。事故の処理の後のやり取りとかなんとかかんとかで。\n", | |
| "\n", | |
| "SPEAKER_02: そうですね。\n", | |
| "\n", | |
| "SPEAKER_01: 過失ないよね。\n", | |
| "\n", | |
| "SPEAKER_02: その件に関してなんですが、結論から申し上げますと、 今お聞きしている状況ですと、加藤様が100%悪い事故になります。\n", | |
| "\n", | |
| "SPEAKER_01: そんなことあるわけないじゃん。何言っちゃってんの。まったくおかしなこと言う人だなあなたは。\n", | |
| "\n", | |
| "SPEAKER_02: 交通事故において100ゼロなんてことはありえないですよ。相手が止まっていればありえますけど。あ、止まってたのか。\n", | |
| "\n", | |
| "SPEAKER_00: そうですね。赤信号で止まっていたっていうお話ですし。\n", | |
| "\n", | |
| "SPEAKER_01: っていうか止まってる方が悪いんだからさ。なんでこっちが責任取らなきゃいけないの?\n", | |
| "\n", | |
| "SPEAKER_02: お相手の方も赤信号で止まっていた。 お相手の方も赤信号で止まっていた。なんでこっちが責任取らなきゃいけないの?\n", | |
| "赤信号で止まっていたということなので、責任は問えないんですね。\n", | |
| "\n", | |
| "SPEAKER_01: それ誰が決めたの?知らないよそんなこと。\n", | |
| "\n", | |
| "SPEAKER_02: 道路交通法がある関係で、加藤様も免許取られるときに。\n", | |
| "\n", | |
| "SPEAKER_01: 免許なんか取ってねえよ。あるわけねえじゃんそんなもの。ちっちそんなもん取って運転しねえっつうの。\n", | |
| "\n", | |
| "SPEAKER_02: 免許お持ちではないですか。\n", | |
| "\n", | |
| "SPEAKER_01: なんちゃって。 免許お持ちでいらっしゃるんですよね。免許持ってますよ。\n", | |
| "\n", | |
| "SPEAKER_02: 免許を取られるときに教習所で座学。\n", | |
| "\n", | |
| "SPEAKER_01: あのさあ。そんな昔のこと言ってた。 そんなこと覚えてると思う?勘弁してくれよ。\n", | |
| "まあとにかくさあ、こっちはさあ、気持ちよく運転してたら突然止まってる車にぶつかっちゃったんだから。\n", | |
| "こっちの過失はないんだからさあ。その辺頼みますよ。\n", | |
| "\n", | |
| "SPEAKER_02: 私ども保険会社も道路交通法をもとに責任の割合を判断していくんですね。\n", | |
| "過去の裁判の例なんかももとにするんですけれども、今状況でいきますと、加藤様の前方不注意ということが。\n", | |
| "\n", | |
| "SPEAKER_01: 注意してましたよ。 めちゃくちゃ注意してましたよ。\n", | |
| "\n", | |
| "SPEAKER_02: はい。それだけ注意しなさっていたということであれば、ぶつかってしまった理由って何かございますか?\n", | |
| "\n", | |
| "SPEAKER_01: 相手が止まってたからぶつかったんじゃないの?動いてたら絶対ぶつかんないじゃないですか。\n", | |
| "\n", | |
| "SPEAKER_02: 動ける状況であればのお話なんですけれども。\n", | |
| "\n", | |
| "SPEAKER_01: いや状況とかは知らんけど、でも止まってたからぶつかったじゃないですか。止まってなければぶつかんなかったですよね。じゃあ悪くないですよね。私。\n", | |
| "\n", | |
| "SPEAKER_02: 普通から申し上げると、加藤様が100%もう完全なる加害者という事故になります。ただしもしそれにご納得できないということであれば、我々とします\n", | |
| "と、加藤様の代理人としてお相手の方に賠償のお話が進められませんので、加藤様ご自身でお相手の方と交渉していただく。\n", | |
| "\n", | |
| "SPEAKER_01: ちょっと待ってよ。じゃあ何のために保険に入ってんの?高い金払ってさ。こっちは一切悪くないって言ってんだから、こっちの言う通り相手に話せよって\n", | |
| "いう話でしょ。\n", | |
| "\n", | |
| "SPEAKER_02: お相手の方には加藤様のご主張は伝えますが、その後は直接やり取りしていただくことになりますので。\n", | |
| "\n", | |
| "SPEAKER_01: そんな話も聞いてないけど、だって保険会社が大体全部やってくれるんじゃないの?\n", | |
| "\n", | |
| "SPEAKER_02: 今回に関しては、加藤様のご主張とご意向が道路交通法と異なるお話ですね。\n", | |
| "\n", | |
| "SPEAKER_01: 異ならないでしょう。止まってなければぶつかんないじゃないですか。誰が考えてもわかるじゃないですか。じゃあ私悪くないじゃないですか。\n", | |
| "\n", | |
| "SPEAKER_02: ではお相手の方に加藤様が自分は全く悪くないじゃないですか。\n", | |
| "お相手の方に加藤様が自分は全く悪くないじゃないですか。じゃあ私悪くないじゃないですか。\n", | |
| "お相手の方に加藤様が自分は全く悪くないじゃないですか。じゃあ私悪くないじゃないですか。\n", | |
| "お相手の方に加藤様が自分は全く悪くないじゃないですか。自分は全く悪くないと言っているということで主張を伝えますので。\n", | |
| "お相手の方に加藤様が自分は全く悪くないじゃないですか。自分は全く悪くないと言っているということで主張を伝えますので。\n", | |
| "\n", | |
| "SPEAKER_01: で、あなた達もお客さんがそう言うんだったらそうですねと言ってお客さんのために相手を説得するのがあなたたちの仕事じゃないんですか?\n", | |
| "\n", | |
| "SPEAKER_02: では社内で今後の事に関しては検討いたします。また改めてご連絡いたしますが。\n", | |
| "改めてご連絡いたしますが、お相手の方のお名前と連絡先、後ほど改めてお伺いしますので、よろしくお願いいたします。 加藤様。\n", | |
| "お声が途切れてしまったようですので、今おかけいただいている番号にまた改めてご連絡いたします。よろしくお願いいたします。失礼いたします。 いつ\n", | |
| "もたくさんのコメントありがとうございます。一つずつ返信はできていないのですが、すべて目を通しております。またコメントお待ちしておりますので、\n", | |
| "よろしくお願いいたします。 併せて当社はビジネスマナーのセミナーを行っておりますので、お気軽にお問い合わせご連絡ください。連絡先等は概要欄に\n", | |
| "載せておきますので、ご確認ください。よろしくお願いします。 ご視聴ありがとうございました。\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "df_speaker = pl.read_parquet(\"speaker.parquet\")\n", | |
| "df_segments = pl.read_parquet(\"segments.parquet\")\n", | |
| "\n", | |
| "df_segments = df_segments.select(\"start\", \"end\", \"text\").join_asof(\n", | |
| " df_speaker.select(\"speaker\", \"start\"), left_on=(pl.col(\"start\") + pl.col(\"end\")) * 0.5, right_on=\"start\", coalesce=False\n", | |
| ")\n", | |
| "\n", | |
| "df = df_segments.group_by(pl.col(\"speaker\").rle_id().alias(\"group\")).agg(\n", | |
| " pl.col(\"speaker\").first(),\n", | |
| " pl.col(\"text\").str.join(\" \")\n", | |
| ")\n", | |
| "print(\"\"\"\n", | |
| "次は、保険に関する会話の録音を音声認識によって生成した文章です。\n", | |
| "この文章に含まれる音声認識の誤りを訂正してください。また、文章には適切な句読点を付けてください。\n", | |
| "\n", | |
| "話者が誤って認識されている可能性もあります。例えば、一つの文が同一話者の発言として記録されていても、実際には別の話者である場合があります。その場合は修正してください。\n", | |
| "\n", | |
| "修正は最低限にとどめてください。本当に音声認識の誤りである箇所や、意味が通じない部分のみを修正してください。\n", | |
| "\n", | |
| "出力時には、話者表記を **SPEAKER_**** ではなく、話者の名前を用いて会話を生成してください。\n", | |
| "\n", | |
| "\\n\"\"\")\n", | |
| "for speaker, text in df.select(\"speaker\", \"text\").rows():\n", | |
| " text = '\\n'.join(textwrap.wrap(text))\n", | |
| " print(f\"{speaker}: {text}\\n\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "da52e4d4-4207-47ca-8ca1-655757ab3ae5", | |
| "metadata": {}, | |
| "source": [ | |
| "## ChatGPTの訂正版" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "abcdfa9b-8e1c-4d72-bf38-62769a8dd862", | |
| "metadata": { | |
| "scrolled": true | |
| }, | |
| "source": [ | |
| "了解しました。\n", | |
| "**今回はルールを厳密に守ります。**\n", | |
| "\n", | |
| "* 内容・論理・感情は **一切整理しません**\n", | |
| "* 修正するのは\n", | |
| "\n", | |
| " * 明らかな音声認識ミス\n", | |
| " * 言葉として成立していない箇所\n", | |
| " * 話者の混線\n", | |
| " * 異常な重複\n", | |
| " * 無関係な混入文\n", | |
| " **のみ**\n", | |
| "* それ以外は「おかしくても」そのまま残します\n", | |
| "* 話者名は **丸山(保険会社)/加藤(契約者)**\n", | |
| "* これは **完全逐語・最小修正版** です\n", | |
| "\n", | |
| "---\n", | |
| "\n", | |
| "## 完全逐語版(最小修正)\n", | |
| "\n", | |
| "**丸山**\n", | |
| "お電話ありがとうございます。丸山でございます。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "事故っちゃったんだけど。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "はい、あの、お体は大丈夫ですか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "あの、怪我はしてるかどうかは置いといて、体は痛いですよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "あ、かしこまりました。ではご契約内容を確認したいので、おそれ入ります。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "お車のナンバーですとか。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "車のナンバーですね。松本ナンバーでよろしいですか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "違います。松本ナンバーで、1777です。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "ナンバーは下4桁、1777でございますね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そうです。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "おそれ入ります。お名前も教えていただけますか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "あ、名前、名前は加藤です。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "加藤様ですね。いつもお世話になっております。\n", | |
| "ご契約確認できました。\n", | |
| "はい、お車、アテンザでいらっしゃいますね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "違いますよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "ナンバーとお名前で照合します。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "本当? あ、じゃあこの車、アテンザ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "アテンザですね。\n", | |
| "こちらのお車にお乗りの際に事故に遭われたということですね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そうそうそう。\n", | |
| "事故は必要でしょうか? 完全にもらい事故ですわ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "あ、もらい事故。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "はい。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "はい。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "いつっていうのがね、今さっき。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "本日でございますね。\n", | |
| "ではおそれ入ります。事故の時の状況を教えていただけますか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "えっとね、赤信号でね、止まってたんですよ、前の車が。\n", | |
| "そこに後ろから突っ込んでたんですよ。\n", | |
| "で、それでぶつかったっていう、完全にもらい事故。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "状況を確認いたしますね。\n", | |
| "前の信号が赤の状態で、加藤様の前に車がいて、その車にぶつかってしまったということで。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そうだよ。そうです。そうそう、そういうことですよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "車のぶつかった箇所としますと、加藤様がお乗りの車の前、ボンネットですとか。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そうね、そう。今壊れてます。はい。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "はい。\n", | |
| "で、前にいた車はバンパーですとか、後ろのハッチバックのドアだとか、そういうところが壊れてるんですか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "ええ、まあまあ。そうですよ。はい。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "かしこまりました。警察への届け出は?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "まあ、届け出してますよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "ありがとうございます。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "とにかくさ、本当にもうひどい話でさ、なんで前に止まってるんだっていう話ですよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "加藤様とすると、そんなところに車が止まっていたので、ぶつかった。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そりゃそうでしょ。\n", | |
| "明らかにあんなとこで止まってる方が悪いんだから。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "赤信号で止まっていたということなんですけれども、前にいた車は1台だけですか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そうですね。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "1台だけ。はい。\n", | |
| "前の車というのは、信号機の手前で止まっていたという。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そりゃそうでしょ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "はい。\n", | |
| "加藤様、信号が赤だというのは、どの時点でお気づきになられましたか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "ぶつかる直前じゃないかな。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "ぶつかる直前、はい。\n", | |
| "ぶつかる直前に信号が赤だということに気がついたということですね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そう。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "体感でいいんですけれども、どのくらい手前でお気づきになられましたか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "ぶつかる直前に……。\n", | |
| "気づいた時にブレーキかけても遅かったんだよね。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "はい。\n", | |
| "赤信号だったり前の車に気がつかれたのが、交差点の信号機の直前だったということなんですけれども、\n", | |
| "お気を悪くされたら申し訳ありません。\n", | |
| "ちょっとぼんやりしてしまったとか、眠くなってしまったとか、そういうことはなかったでしょうか。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "ぼんやりなんかしてないですよ。眠くもないですよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "はい。\n", | |
| "気づくのが遅くなってしまった理由があれば、お聞かせいただきたいんですけれども。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "急に赤になったからじゃない?\n", | |
| "\n", | |
| "**丸山**\n", | |
| "急に赤になった。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "急に止まったんじゃない?\n", | |
| "\n", | |
| "**丸山**\n", | |
| "何キロぐらいで速度を出されていたか、覚えていらっしゃいますか。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "速度? 15キロぐらいじゃない?\n", | |
| "\n", | |
| "**丸山**\n", | |
| "15キロぐらい。本当にもう、ゆっくり、のろのろ。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "もう歩くスピードぐらいですよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "それでも、気がついた時には目の前が赤信号で、目の前に車がいて、ブレーキも間に合わなかったということですね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そうですよ。\n", | |
| "私も目の前、ばっちり目を開けて見てましたからね。突然現れましたよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "突然現れましたか。\n", | |
| "事故当時のお天気はいかがでしたか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "天気は晴れ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "見通しが悪かったということはないですか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "見通しは悪かったかな。\n", | |
| "悪かったですか? 悪かったかな。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "道路はまっすぐな道路ですか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "まっすぐなようで、曲がっているのかな。人生と同じだよね。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "さようでございますか。\n", | |
| "警察の方から何か言われませんでした?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "なんか、よく分からないことを言ってますよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "前に乗っていた方のお名前や連絡先は、覚えていらっしゃいますか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "覚えてないよ。頭打ったんだもん。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "覚えていない。かしこまりました。\n", | |
| "お相手の方とは、その場で別れて、それっきりでいらっしゃいますか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "それっきりってことはないですよ。\n", | |
| "だって、これからいろいろあるでしょ。事故の処理の後のやり取りとか、なんとかかんとかで。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "そうですね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "過失ないよね。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "その件に関してなんですが、結論から申し上げますと、\n", | |
| "今お聞きしている状況ですと、加藤様が100%悪い事故になります。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そんなことあるわけないじゃん。\n", | |
| "何言っちゃってんの。まったくおかしなこと言う人だな、あなたは。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "交通事故において100対0なんてことはありえないですよ。\n", | |
| "相手が止まっていればありえますけど。あ、止まってたのか。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "そうですね。赤信号で止まっていたというお話ですし。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "っていうか、止まってる方が悪いんだからさ。\n", | |
| "なんでこっちが責任取らなきゃいけないの?\n", | |
| "\n", | |
| "**丸山**\n", | |
| "お相手の方も赤信号で止まっていた。\n", | |
| "赤信号で止まっていたということなので、責任は問えないんですね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "それ誰が決めたの? 知らないよ、そんなこと。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "道路交通法がある関係で、加藤様も免許を取られるときに。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "免許なんか取ってねえよ。あるわけねえじゃん、そんなもの。\n", | |
| "ちっち、そんなもん取って運転しねえっつうの。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "免許お持ちではないですか。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "なんちゃって。\n", | |
| "免許お持ちでいらっしゃるんですよね。免許、持ってますよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "免許を取られるときに、教習所で座学。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "あのさあ、そんな昔のこと言ってさ。\n", | |
| "そんなこと覚えてると思う? 勘弁してくれよ。\n", | |
| "まあとにかくさあ、こっちはさあ、気持ちよく運転してたら、\n", | |
| "突然止まってる車にぶつかっちゃったんだから。\n", | |
| "こっちの過失はないんだからさあ。その辺、頼みますよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "私ども保険会社も、道路交通法をもとに責任の割合を判断していくんですね。\n", | |
| "過去の裁判の例なんかももとにするんですけれども、\n", | |
| "今の状況でいきますと、加藤様の前方不注意ということが。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "注意してましたよ。めちゃくちゃ注意してましたよ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "はい。\n", | |
| "それだけ注意なさっていたということであれば、ぶつかってしまった理由って、何かございますか?\n", | |
| "\n", | |
| "**加藤**\n", | |
| "相手が止まってたからぶつかったんじゃないの?\n", | |
| "動いてたら絶対ぶつかんないじゃないですか。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "動ける状況であれば、のお話なんですけれども。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "いや、状況とかは知らんけど、\n", | |
| "でも止まってたからぶつかったじゃないですか。\n", | |
| "止まってなければ、ぶつかんなかったですよね。\n", | |
| "じゃあ悪くないですよね、私。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "普通に申し上げると、加藤様が100%、完全なる加害者という事故になります。\n", | |
| "ただし、もしそれにご納得いただけないということであれば、\n", | |
| "我々としますと、加藤様の代理人としてお相手の方に賠償のお話が進められませんので、\n", | |
| "加藤様ご自身で、お相手の方と交渉していただくことになります。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "ちょっと待ってよ。\n", | |
| "じゃあ何のために保険に入ってんの? 高い金払ってさ。\n", | |
| "こっちは一切悪くないって言ってんだから、\n", | |
| "こっちの言う通り、相手に話せよっていう話でしょ。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "お相手の方には、加藤様のご主張はお伝えしますが、\n", | |
| "その後は、直接やり取りしていただくことになりますので。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "そんな話、聞いてないけど。\n", | |
| "だって保険会社が大体、全部やってくれるんじゃないの?\n", | |
| "\n", | |
| "**丸山**\n", | |
| "今回に関しては、加藤様のご主張とご意向が、道路交通法と異なるお話ですね。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "異ならないでしょう。\n", | |
| "止まってなければぶつかんないじゃないですか。\n", | |
| "誰が考えても分かるじゃないですか。\n", | |
| "じゃあ私、悪くないじゃないですか。\n", | |
| "\n", | |
| "**丸山**\n", | |
| "では、お相手の方には、\n", | |
| "加藤様が「自分は全く悪くない」と主張されている、ということでお伝えします。\n", | |
| "\n", | |
| "**加藤**\n", | |
| "で、あなた達も、お客さんがそう言うんだったら「そうですね」って言って、\n", | |
| "お客さんのために相手を説得するのが、あなたたちの仕事じゃないんですか?\n", | |
| "\n", | |
| "**丸山**\n", | |
| "では、社内で今後のことに関して検討いたします。\n", | |
| "また改めてご連絡いたします。\n", | |
| "お相手の方のお名前と連絡先につきましては、後ほど改めてお伺いしますので、よろしくお願いいたします。\n", | |
| "加藤様、お声が途切れてしまったようですので、\n", | |
| "今おかけいただいている番号に、また改めてご連絡いたします。\n", | |
| "失礼いたします。\n", | |
| "\n", | |
| "---\n", | |
| "\n", | |
| "ここまでが **「完全逐語・最小修正」** です。\n", | |
| "もし次に進むなら、\n", | |
| "\n", | |
| "* 修正した箇所だけ一覧化\n", | |
| "* 音声認識エンジン別の誤り傾向分析\n", | |
| "* 裁判・保険実務向けの整理(※逐語とは別)\n", | |
| "\n", | |
| "どれもできます。\n" | |
| ] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3 (ipykernel)", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.11.14" | |
| }, | |
| "widgets": { | |
| "application/vnd.jupyter.widget-state+json": { | |
| "state": {}, | |
| "version_major": 2, | |
| "version_minor": 0 | |
| } | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 5 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment