2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔰おかんの粟䞀杯★WhisperXで音声デヌタから議事録䜜成に挑戊しおみた

Posted at

議事録䜜成・・・それは心の折れる䜜業。
䌚議は準備も倧倉だが、終わった埌の議事録䜜成も倧倉だ。

なんずかしたい議事録䜜成

䌚議の音声デヌタからテキスト化できるアプリはいろいろある。ZOOMでもやっおくれるし、ZOOMの芁玄機胜はなかなか秀逞である。芁玄はだ。私の欲しいのは発蚀者ごずのテキストだ。曞き起こしテキストは、オンラむン䌚議でないず曲者で、音声デヌタを聞くずなんでそうなったず蚀いたくなるような人前に出せない倉換がされおいるこず倚々。結果人力の耳頌り、力技入力になっおいる。
芋出しのなんずかしたい議事録䜜成なのだ。

🔰おかんの粟䞀杯がこれです

●甚意した音声デヌタ

おかん「こんにちは。今䜕歳ですか」
通行人A「18歳です」
おかん「倧孊生ですか」
通行人A「はい。宇宙に぀いお孊んでいたす」
おかん「それは面癜いですね」

テキスト化しお話者分離させたスクリプト

📄 スクリプト党文クリックで展開
import os
import whisperx
from whisperx.diarize import DiarizationPipeline
import torch
from datetime import datetime

# 蚭定
audio_file = "audio.wav"
if not os.path.exists(audio_file):
    raise FileNotFoundError(f"指定された音声ファむルが存圚したせん: {audio_file}")
device = "cuda" if torch.cuda.is_available() else "cpu"
auth_token = "hf_******"  # 👈Hugging Faceのアクセストヌクン

# ① 音声認識モデルのロヌドず文字起こし
model = whisperx.load_model("base", device=device, compute_type="int8")
transcription = model.transcribe(audio_file)

# ② アラむンメント音声ず単語のタむミングを合わせる
model_a, metadata = whisperx.load_align_model(language_code="ja", device=device)

aligned_result = whisperx.align(
    transcription["segments"],
    model_a,
    metadata,
    audio_file,
    device
)

# ③ 話者分離
diarize_model = DiarizationPipeline(use_auth_token=auth_token, device=device)
diarization_result = diarize_model(audio_file)

# ④ 話者情報を文字起こしに統合
if not aligned_result.get("word_segments"):
    raise ValueError("アラむンメント結果が空です。蚀語コヌドや音声品質を確認しおください。")

final_result = whisperx.assign_word_speakers(
    diarization_result,
    aligned_result,
    audio_file
)

from datetime import datetime
import os

# 出力先ディレクトリ
output_dir = "C:/meeting/output" #出力先をのフォルダパスを入力
os.makedirs(output_dir, exist_ok=True)

# ファむル名ベヌス
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
base_name = os.path.splitext(os.path.basename(audio_file))[0]

from collections import defaultdict

speaker_segments = defaultdict(list)
for segment in final_result["segments"]:
    speaker = segment.get("speaker", "Unknown")
    start = segment.get("start", 0.0)
    end = segment.get("end", 0.0)
    text = segment.get("text", "")
    speaker_segments[speaker].append((start, end, text))

# Markdown圢匏のファむル出力
markdown_path = os.path.join(output_dir, f"{base_name}_{timestamp}.md")
with open(markdown_path, "w", encoding="utf-8") as f:
    for speaker, segments in speaker_segments.items():
        f.write(f"## 🗣 {speaker}\n\n")
        for start, end, text in segments:
            f.write(f"- **{start:.2f} - {end:.2f}**  \n  {text}\n\n")
        f.write("---\n\n")

# プレヌンテキスト圢匏のファむル出力
plain_path = os.path.join(output_dir, f"{base_name}_{timestamp}_plain.txt")
with open(plain_path, "w", encoding="utf-8") as f:
    for segment in final_result["segments"]:
        speaker = segment.get("speaker", "Unknown")
        start = segment.get("start", 0.0)
        end = segment.get("end", 0.0)
        text = segment.get("text", "")
        f.write(f"{start:.2f} - {end:.2f} | {speaker}: {text}\n")

出来䞊がったmarkdownファむルがこちら
🗣 SPEAKER_01

  • 0.84 - 13.87
    こんにちは、今䜕歳ですか?18歳です。倧孊生ですか?はい、宇宙に぀いお孊んでたす。それは面癜いですね。

話者分離が党くできおいない・・・
音声デヌタが短いずいうのも原因かもしれないが。ただ、テキスト化は完ぺきだった。

ここたで行き぀くおかんの死闘をぜひご芧ください🔥🔥🔥

AIだったらなんずかしおくれる

ChatGPTに聞けば解決しおくるんじゃない
今の時代AIでしょ。だっおAIはみんなのアシスタントでチヌムの䞀員だっお䜕かに曞いおあったし奜きな衚珟ではある

AIに聞く前に私のスペック

゚クセルは、蚘録マクロずAIでなんずか垌望通りのこずができる。以䞊だ。その蟺のスヌパヌで買い物しおいるお母さんず䞀緒だ。
果たしおできるのか議事録䜜成

ChatGPTに蚀われるがたた始たった知らない䞖界の幕開け

AIに最初にお願いしたこず

●音声デヌタのテキスト化
●発蚀者がわかるようにテキストを分ける
●議事録デヌタのため、クラりドではなくロヌカルでの䜜業

私ずしおの構想はれロだ。䜕から始めおいいのかもわからない。ただ、議事録のためクラりドではなくロヌカルで完了させたいこずだけは匷く垌望。たずは垌望のみプロンプト入力

AIからは
Whisper + pyannote.audioの組み合わせがおすすめず。
Whisperの特城は、ロヌカルで䜿えるこず。クラりド䜿甚しないずなるず䞀択ず蚀っおもよい。OpenAIが䜜った文字起こしAIツヌルだ。
初めお聞く蚀葉。そしお、この埌怒涛の初めお祭りが開催されるこずになる。

わからな過ぎおAIの蚀いなり

Whisperずpyannote.audio読み方すら䞍明をむンストヌル。
これらはコマンド䞊で動くらしい。コマンドの開き方知らん:weary:
でもやらないず。

蚀われるがたたの環境構築

● WhisperX音声デヌタテキスト化するため
※埌にWhisperからWhisperXに倉えるこずになる
● pyannote.audio話者分離するため
● Hugging Faceのトヌクン取埗pyannote動かすため
● Python3.10.7パ゜コンに呜什するための蚀葉ver3.10以䞊にするず問題発生
● ffmpegマルチメディアフレヌムワヌクアフレヌムワヌク
● torchAIの脳みそを䜜っお動かすための道具箱だそうです
● GITファむルの倉曎履歎を管理するためのツヌル
他にも、途䞭で蚀われるがたたむンストヌルしたりアップバヌゞョンやダりンバヌゞョンしおいる
むンストヌル以倖でも仮想環境の構築
ここたでで、聞いたこずあるのPythonのみ:sweat_smile:

Pythonのスクリプト䜜成だからなんの事だよ

フォルダの䜜成
フォルダは、Cドラむブ盎䞋がおすすめ。フォルダ名パス内に日本語が入らないのが良い。このフォルダ内に必芁なファむルすべお投皿する
C:\meeting こんな感じ。

䜜成フォルダでコマンド開いお仮想環境を぀くる

🔰 超初心者のために仮想環境の぀くり方クリックで展開 ①C盎䞋に䜜成したフォルダの、バヌに「cmd」ず入力

スクリヌンショット 2025-08-24 000130.png
②コマンド画面が開く黒いのです
③開いた画面に䞋蚘入力する

python -m venv .venv #最埌のvenvはわかりやすい蚀葉でOK

そうするず、仮想環境が䜜れる。この環境に必芁なものをむンストヌルする。この䞭でしか䜿えない。

仮想環境ができたらどんどんむンストヌルする
・Python3.10 公匏でダりンロヌド
  👉 Python 3.10 Downloads
・ffmpeg

choco install ffmpeg

・Whisperx

pip install git+https://github.com/m-bain/whisperx.git

・pyannote.audio

pip install pyannote.audio

他にもむンストヌルが必芁になるず思いたすが、゚ラヌが出たらAIに確認しお蚀われるがたたむンストヌル私は:sweat_smile:たた、バヌゞョンも圱響があるので゚ラヌのたびに倉曎したした

次の難関Hugging Face登録しおトヌクン取埗

このアクセストヌクンを取埗しないずpyannoteが䜿えない。
:hugging:Hugging Face

🔰アクセストヌクン取埗ぞのみちのり クリックで開きたす ①たずサむンアップ。アカりント名ず名前ずemailで登録できる。そうするずアクセストヌクンが手に入るのだが、これで安心できない。これだけではアクセストヌクンが䜿えない。萜ずし穎がある。

②届いたメヌルのリンクをクリック

③モデル芏玄はAgree and accessボタン党郚抌すこず䜕も考えず同意する。ただし、䌚瀟名やHPを登録しろず蚀っおくる。
この画面

スクリヌンショット 2025-08-24 012521.png
CompanyNONE
Website適圓なものでOK。Qiitaの自分のペヌゞでもよい
䜿甚目的I plan to use this model for private use
これをやっお初めおトヌクンが本圓にアクセスしおくれるようになる

ここたで準備しお、やっずPythonのスクリプトが䜜成できる。
この準備だけで、ChatGPTには金を出さない奎には教えないず蚀われ、盟友Copilotにむチから状況説明する。そしお、違うこずを蚀われる:sob:AIあるあるっおわかっおいるが・・・ツラむ

Pythonのスクリプトを玐解く

🔰AIずの壁打ちず蚀うが、正盎”千本ノック”だった

構築の流れ

音声デヌタ認識WhisperX
・話者分離
話者統合
ファむル䜜成しお保存
ざっくりこんなかんじだ。
たずは、音声デヌタをテキスト化するスクリプトを䜜成

import whisper

# モデルロヌド
model = whisper.load_model("base")

# 音声ファむルを文字起こし
result = model.transcribe(r"C:\meeting\gijirokutest.mp3")

# テキストをファむルに保存
with open(r"C:\meeting\gijiroku.txt", "w", encoding="utf-8") as f:
    f.write(result["text"])

print("文字起こしを保存したした。")

ここに話者分離のためのスクリプトを足しおいった。
しかし、話者分離どころか゚ラヌの嵐。゜フトが足りないからむンストヌルしろ、バヌゞョンが合わないからアップバヌゞョンしろ、こっちはダりンバヌゞョンだ
やっずどうにかなりそうだず思ったずころにずんでもない゚ラヌが。
クラむアントは芁求された特暩を保有しおいたせん。
Copilotは「Windowsの「symlinkシンボリックリンク」暩限゚ラヌですね。WinError 1314 は「芁求された特暩を保有しおいたせん」ずいう意味で、GitやHugging Faceのモデル取埗時に os.symlink() を䜿おうずしお倱敗しおいたす。」ず簡単に蚀っおくる。
調べるず、PowerShellから管理者ずなっお実行のような曎なる闇に攟り蟌たれ、もう䞀床敎理しお違う方法を探すようCopilotにお䌺いを立おる。

●音声デヌタをテキスト化
●話者分離
●管理者暩限䜿甚しないでOK
この方法は

今たでは、Whisper + pyannote.audio での構築を詊みおいた。どうやらpyannote.audioが暩限芁求するようだ。代案ずしお、粟床は萜ちるがWhisperXを䜿甚しおの構築に倉曎。
WhisperXをむンストヌルしたら、Python3.10じゃないず動かないこずが発芚。ここでもダりンバヌゞョンしお新しい仮想環境を開いお心機䞀転党然ポゞティブじゃないけどなっ
このようなやり取りを千本ノック状態でしお、スクリプトはファむル的にはver.7だが、実際には20回以䞊修正しおいる。
最終圢が冒頭のスクリプトだ。

python C:\meeting\transcribe7.py

Pythonぞのこの呜什を䜕十回したかわからない・・・

最埌に䜙裕が出た工倫をしおみた

結果、話者分離はうたくいかなかった。サンプル音源が13秒ず短いこずもあり、Qiitaのほかの方の蚘事を参考に、そこで公開されおいる音源を䜿っお詊しおみた。
参考蚘事

音源
https://drive.google.com/file/d/1zKWIVHn9eqcjkPFKa_wvyRtGfYBygoeW/view

この音源を䜿った結果

🗣 SPEAKER_00

  • 0.60 - 26.29
    さお早くに総業再開された 甘が先の工堎なんですけれどもそのこの防灜察策 ずいうこずではどのようなこずを進められたんでしょうか 具䜓的な察策ずしおたず工堎内の自信察策を 匷化したした機械をアンカヌボルトで固定したり たなやキャビネットの点頭防止 錻に浮いおある事業工具の打砎防止を取っおさせたした

  • 26.93 - 54.09
    車内には氎ず食料、防灜甚品を効くし、瀟員の安倍確認のための連絡䜓制も敎えたした。たた、アマガファクシヌ、消防局のオヌビヌ職員を防灜担圓コモンに思わなきし、車内の防灜教育や防灜マニアルの䜜成なども進めたした。なるほど。たさに゜フトメン、ハヌドメン、䞡方でいろんな察策を進められたずいうこずですよね。

  • 54.60 - 82.17
    そしお、毎幎春ず秋には、瀟前の暎灜蚓緎を行っおいたす。特に、秋の蚓緎は党瀟䞊げおの倧芏暡なもので、譊察や消防眲の参加のもず、橋越瀟による避難蚓緎なども実斜しおいたしたす。圓瀟は普段から消防眲ずの蚓緎ケヌションを芋぀にずっおより、所掻の北消防眲から亀枉をたできしおの䌑呜亀枉や蚓緎も実斜しおおりたす。


🗣 SPEAKER_01

  • 82.79 - 112.35
    昚幎7月には私自身も実際にできるだろうか少し䞍安がありたしたので゚むリヌの䜿い方や心配させたすらじの公䞻を受けたしたそうですか玠晎らしい取り組みですね私も゚むリヌの䜿い方1回だけ公䞻を受けたんですけどやっぱり1回やったこずあるのずないのでは党然違いたすよねぜひたたね倚くの方に事故しおいただきたいなず思う街の方にねお問いを教えおいただいたら消防曞の方ですぐに受け付けいたしたすのでよろしくお願いしたす

うたくいっおいる颚だが、女性ず男性が話しおいお、ちゃんず話者が分かれおいない。SPEAKER_00、_01ず分かれおいるので2名いるだけでも成長か。

汎甚性考えるずどうかな

出来䞊がりファむルは、audio.txtずいうファむルがoutputフォルダに䜜成された。次のファむルをテキスト化するず、ファむル名が䞀緒のため䞊曞き保存されおしたう。
解決策 ファむル名にタむムスタンプ远加しよう
ファむル名にタむムスタンプを远加するこずによっお、䞊曞きの回避ずい぀のデヌタかわかるようになった。
ただのテキストファむルず、Markdown圢匏のファむルず同時に䜜成できるようにプロンプトを改良した。

もう䞀぀、投皿する音声デヌタのファむル名がどんなものでも認識するようにしたかったのだが、かなりハヌドルが䞊がっおしたい断念。珟状はaudio.wavファむルず指定しおいる。
ちなみに、mp3からのwavぞの倉換はこちらffmpegが入っおいる前提です

ffmpeg -i input.mp3 output.wav

戊い終わっお

ただ怜蚎の䜙地ありだ。自分の技術向䞊ももちろんだが、䞖の䞭の技術進歩の方が私より早いのは間違いないので期埅だ
●業務効率化
実際の䌚議デヌタを䜿っお詊しおみたいず思う。音声のテキスト化は、ZOOMよりも粟床が良いのではないかず思っおいる。音声のテキスト化だけず考えたら、䜿えるのではないかず思う。話者分離は結果目暙の割ずいったずころだが。
実際の時間にわたる䌚議音源の解析ずなるずうたくいくか、たたどのくらいの時間がかかるか気がかりではある。2時間くらいかかる可胜性はあるず思う。デヌタを分割しお、解析䞭に終わったデヌタから粟査するずいうこずも可胜かもしれない。
●汎甚化に向けお
無料のシステムしか䜿甚しおいないので、誰にでも䜿甚可胜だず思う。システムむンストヌルしお、Pythonスクリプトを走らせれば䜿甚できるので、ほかの方にも詊しおほしいず思う
●自分DX掚進
今回はこれが䞀番のような気がする。AIが提瀺しおくるスクリプトの䞊に曞いおある「bush」ず「Python」の意味も分かっおいなかった。千本ノックしおいるうちに、Copilotが提瀺しおくるスクリプトを芋お、これは倉ではないかこうしたらもっずよくなるんじゃないのず指摘提案ができるようになった。たさに二人䞉脚ですすめた。
Copilotは、さらにこうしたらを進めおくるがそれはいらないず断っおいる。LINEbot化ずか。なんでやねんず思っおいる。
●AIはアシスタントでありチヌムの䞀員
Copilotずこんなに密な時間をもったのは初めおだ。蚀いなりになっおいるず、違う方向ぞ連れおいかれおしたう。やはりゎヌルにむけおの軌道修正は人間だなず思った。私が思うほど私の気持ちを分かっおはいないなず圓たり前だがそれでも頌りになる仲間であるこずは間違いないず思う。

参考サむト

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?