#!/usr/bin/env python3
import torch
from transformers import AutoProcessor, WhisperForConditionalGeneration
from transformers.utils import is_flash_attn_2_available
import soundfile as sf
import numpy as np
import json, subprocess, os, time

print(f"PyTorch: {torch.__version__}, CUDA: {torch.cuda.is_available()}")
print(f"Device: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'N/A'}")

# Generate LONG audio text (5-10 min speech = ~800-1500 words)
long_text = """
Bonjour et bienvenue dans ce rapport de chantier. Nous sommes le 23 avril 2026 et nous intervenons sur le chantier de rénovation du centre-ville de Montpellier.

L'équipe au complet est présente : trois maçons, deux électriciens et un menuisier. Le chantier a démarré à 7 heures du matin et les conditions météorologiques sont excellentes, avec un ciel dégagé et une température de 22 degrés.

Les travaux prévus pour aujourd'hui concernent la rénovation des façades du bâtiment principal. Nous avons commencé par l'abatage des vieux enduits sur la façade nord du bâtiment, ce qui représente environ 150 mètres carrés de surface. L'équipe de maçons a été très efficace et a terminé cette partie avant midi.

L'après-midi a été consacré à la préparation des supports pour la nouvelle application d'enduit. Nous avons appliqué un primaire d'accrochage sur toute la surface préparée, en veillant à bien respecter les temps de séchage recommandés par le fabricant.

Côté électricité, nous avons procédé au remplacement de l'éclairage extérieur du parking. Les anciens luminaires ont été déposés et les nouveaux LED ont été installés. Les tests ont été concluants et tout fonctionne correctement.

Le menuisier, quant à lui, a travaillé sur la réparation des volets roulants du rez-de-chaussée. Deux volets ont été entièrement remplacés et trois autres ont été réparés. Les tests d'ouverture et de fermeture ont été effectués et tout est en ordre.

Au niveau des anomalies relevées aujourd'hui : nous avons détecté une infiltration d'eau au niveau de la toiture du bâtiment annexe. Cette zone nécessitera une intervention spécifique et une évaluation plus approfondie. Nous recommandons de programmer une visite technique dans les prochains jours pour évaluer l'ampleur des dégâts et établir un devis précis.

Les matériaux utilisés aujourd'hui :
- 20 sacs de mortier de réparation
- 10 litres de primaire d'accrochage
- 2 kits d'éclairage LED extérieur
- 3 volets roulants complets
- 10 mètres de gaine électrique

L'équipe a respecté les consignes de sécurité. Aucun accident n'a été signalé. Le chantier sera fermé à 17 heures et sécurisé pour la nuit.

Prochaines étapes pour demain :
- Application du nouveau enduit sur la façade nord
- Poursuite de la rénovation électrique
- Réparation des volets du bâtiment annexe
- Visite technique de la toiture

Cordialement,
L'équipe de chantier
"""

# Generate audio
print(f"\nGenerating LONG audio (text: {len(long_text)} chars)...")
result = subprocess.run([
    'curl', '-X', 'POST', 'http://192.168.1.127:8101/v1/audio/speech',
    '-H', 'Content-Type: application/json',
    '-d', json.dumps({
        'model': 'openbmb/VoxCPM2',
        'input': f'(voix masculine professionnelle, ton sérieux) {long_text}',
        'voice': 'default',
        'cfg_value': 2.0,
        'inference_timesteps': 10
    }),
    '-o', '/tmp/rcc_test_long.wav'
], capture_output=True, text=True)

if result.returncode != 0 or not os.path.exists('/tmp/rcc_test_long.wav') or os.path.getsize('/tmp/rcc_test_long.wav') < 1000:
    print(f"✗ Audio gen failed: {result.stderr or result.returncode}")
    exit(1)

size = os.path.getsize('/tmp/rcc_test_long.wav')
print(f"✓ Audio saved: /tmp/rcc_test_long.wav ({size/1024:.0f} KB)")

# Load and resample
samples, sr = sf.read('/tmp/rcc_test_long.wav')
target_sr = 16000
num_samples = int(len(samples) * target_sr / sr)
samples_16k = np.interp(
    np.linspace(0, len(samples), num_samples),
    np.linspace(0, len(samples), len(samples)),
    samples
)
print(f"Resampled: {num_samples} samples at {target_sr} Hz, {num_samples/target_sr:.1f}s audio")

# Load model (already loaded from before, just warm up)
print("\nLoading Whisper model...")
processor = AutoProcessor.from_pretrained("openai/whisper-large-v3")
model = WhisperForConditionalGeneration.from_pretrained(
    "openai/whisper-large-v3",
    dtype=torch.float16,
    device_map="cuda:0",
)
print(f"Model loaded.")

# Transcribe
print("\nTranscribing (measuring time)...")
t0 = time.time()
input_features = processor(samples_16k, sampling_rate=target_sr, return_tensors="pt").input_features
input_features = input_features.to("cuda:0", dtype=torch.float16)
output_ids = model.generate(input_features, language="fr", max_new_tokens=256)
text = processor.batch_decode(output_ids, skip_special_tokens=True)[0]
elapsed = time.time() - t0

print(f"\n✓ Transcript ({len(text)} chars):")
print(text[:500])
print(f"\n⏱️ Transcription time: {elapsed:.1f}s for {num_samples/target_sr:.1f}s audio")
print(f"📊 RTF (Real-Time Factor): {elapsed/(num_samples/target_sr):.2f}")
