import torch
import gradio as gr
from transformers import pipeline
from pyannote.audio import Pipeline
import datetime
from pydub import AudioSegment
import os

# โมเดลถอดเสียง
MODEL_NAME = "biodatlab/whisper-th-medium-combined"
device = 0 if torch.cuda.is_available() else "cpu"

pipe = pipeline(
    task="automatic-speech-recognition",
    model=MODEL_NAME,
    chunk_length_s=30,
    device=device,
)

# โมเดลแยกเสียงคนพูด
HF_TOKEN = os.environ.get("HF_TOKEN")
if not HF_TOKEN:
    raise ValueError("กรุณาตั้งค่า HF_TOKEN ใน environment variables")

diarization = Pipeline.from_pretrained(
    "pyannote/speaker-diarization@2.1",
    use_auth_token=HF_TOKEN
)

def format_timestamp(seconds):
    return str(datetime.timedelta(seconds=seconds)).split(".")[0]

def process_audio(audio_file):
    if audio_file is None:
        return "กรุณาอัพโหลดไฟล์เสียง"
    
    try:
        # แยกเสียงคนพูด
        diarization_result = diarization(audio_file)
        
        # ถอดความและจัดรูปแบบผลลัพธ์
        transcription = pipe(
            audio_file, 
            generate_kwargs={"language": "<|th|>", "task": "transcribe"}, 
            batch_size=16
        )["text"]
        
        # สร้างผลลัพธ์ที่มีการแยกคนพูด
        result = []
        for turn, _, speaker in diarization_result.itertracks(yield_label=True):
            start_time = format_timestamp(turn.start)
            end_time = format_timestamp(turn.end)
            result.append(f"[{start_time} - {end_time}] {speaker}:")
            
        # รวมผลลัพธ์
        final_result = "\n".join(result) + "\n\nคำถอดความ:\n" + transcription
        return final_result
        
    except Exception as e:
        return f"เกิดข้อผิดพลาด: {str(e)}"

# สร้าง Gradio Interface
iface = gr.Interface(
    fn=process_audio,
    inputs=gr.Audio(type="filepath", label="อัพโหลดไฟล์เสียงของคุณ"),
    outputs=gr.Textbox(label="ผลการถอดความ"),
    title="ระบบถอดความเสียงภาษาไทยพร้อมแยกเสียงคนพูด",
    description="ใช้โมเดล Whisper สำหรับถอดความเสียงภาษาไทย และ pyannote.audio สำหรับแยกเสียงคนพูด"
)

# รัน app
iface.launch()