無料のブラウザツールだと、音楽などで、音声とインストラメントを分離することはできるようなのですが、二人が喋っていて、片方の音声に分離することができなかったので、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("⚠️ 対象話者の音声が見つかりませんでした")