無料のブラウザツールだと、音楽などで、音声とインストラメントを分離することはできるようなのですが、二人が喋っていて、片方の音声に分離することができなかったので、Pythonで実行します。
前準備として、以下の手配が必要
1) ffmpeg, pyannote.audio のインストール
2) Hugging Faceでのaccess token発行(read)およびモデル利用のaccept
3) Hugging Faceでのaccess tokenをコードのHUGGINGFACE_TOKENに埋め込み
4) python3 speaker_separation.py の実行
import subprocess from pyannote.audio import Pipeline from pydub import AudioSegment import os from collections import defaultdict # ===== 設定 ===== mp4_file = "video.mp4" wav_file = "conversation.wav" output_file = "main_speaker_only.wav" HUGGINGFACE_TOKEN = "****" # Hugging Face token # ===== WAV変換 ===== if os.path.exists(wav_file): os.remove(wav_file) subprocess.run([ "ffmpeg", "-y", "-i", mp4_file, "-vn", "-acodec", "pcm_s16le", "-ar", "16000", "-ac", "1", wav_file ], check=True) # ===== 話者分離 ===== pipeline = Pipeline.from_pretrained( "pyannote/speaker-diarization-3.1", use_auth_token=HUGGINGFACE_TOKEN ) diarization = pipeline(wav_file) # ===== 各話者の合計発話時間を計算 ===== speaker_durations = defaultdict(float) for turn, _, speaker in diarization.itertracks(yield_label=True): speaker_durations[speaker] += turn.end - turn.start # 発話時間が最も長い話者を自動選択 target_speaker = max(speaker_durations, key=speaker_durations.get) print("選択された話者:", target_speaker) # ===== その話者だけ抽出 ===== audio = AudioSegment.from_wav(wav_file) speaker_segments = [ audio[int(turn.start * 1000): int(turn.end * 1000)] for turn, _, speaker in diarization.itertracks(yield_label=True) if speaker == target_speaker ] if speaker_segments: speaker_audio = sum(speaker_segments) speaker_audio.export(output_file, format="wav") print(f"✅ 保存しました: {output_file}") else: print("⚠️ 対象話者の音声が見つかりませんでした")