VoiceToWrite / diarization.py
Seicas's picture
Update diarization.py
ef80a92 verified
raw
history blame
3.32 kB
from pyannote.audio import Pipeline
from typing import List, Dict, Any
import torch
import os
from config import settings # Düzeltildi
# HuggingFace token'ı ayarla
os.environ["HF_TOKEN"] = "hf_your_token_here" # Bu satırın yorumunu kaldırın ve kendi token'ınızı ekleyin
_diarization_pipeline = None
def get_diarization_pipeline():
"""Diarization pipeline singleton"""
global _diarization_pipeline
if _diarization_pipeline is None:
# GPU varsa kullan
device = "cuda" if torch.cuda.is_available() else "cpu"
_diarization_pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-3.0",
use_auth_token=os.environ.get("HF_TOKEN"),
device=device
)
return _diarization_pipeline
def rename_speakers_for_pediatrics(segments: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
"""
Konuşmacıları pediatri bağlamına göre yeniden isimlendirir
"""
# Konuşmacıları basit bir şekilde yeniden isimlendiriyoruz
# Gerçek bir uygulamada ses özellikleri analizi ile daha sofistike olabilir
renamed_segments = []
speaker_mapping = {}
for segment in segments:
speaker = segment["speaker"]
if speaker not in speaker_mapping:
# İlk konuşmacıyı bölüm başkanı olarak kabul ediyoruz
if len(speaker_mapping) == 0:
speaker_mapping[speaker] = "Bölüm_Başkanı"
# İkinci konuşmacıyı hekim olarak kabul ediyoruz
elif len(speaker_mapping) == 1:
speaker_mapping[speaker] = "Hekim"
# Üçüncü konuşmacıyı asistan olarak kabul ediyoruz
elif len(speaker_mapping) == 2:
speaker_mapping[speaker] = "Asistan"
# Diğer konuşmacılar
else:
speaker_mapping[speaker] = f"Konuşmacı_{len(speaker_mapping) + 1}"
# Segment kopyası oluştur ve konuşmacı ismini güncelle
new_segment = segment.copy()
new_segment["speaker"] = speaker_mapping[speaker]
renamed_segments.append(new_segment)
return renamed_segments
def diarize_segments(audio_file: str, is_pediatrics: bool = True) -> List[Dict[str, Any]]:
"""
Ses dosyasındaki konuşmacıları ayırt eder
Args:
audio_file: Ses dosyasının yolu
Returns:
Konuşmacı segmentleri listesi
[
{"speaker": "speaker_0", "start": 0.5, "end": 2.3, "text": "..."},
{"speaker": "speaker_1", "start": 2.4, "end": 5.1, "text": "..."},
...
]
"""
# Pipeline'ı al
pipeline = get_diarization_pipeline()
# Diyarizasyon gerçekleştir
diarization = pipeline(audio_file)
# Sonuçları formatlayalım
results = []
for turn, _, speaker in diarization.itertracks(yield_label=True):
segment = {
"speaker": speaker,
"start": turn.start,
"end": turn.end,
"text": "" # Bu alanı transcribe işlemi sonrası dolduracağız
}
results.append(segment)
# Pediatri bağlamı için konuşmacı isimlerini güncelle
if is_pediatrics:
results = rename_speakers_for_pediatrics(results)
return results