File size: 2,217 Bytes
7822d84
141ec22
f0c6145
81fab61
1eeafb7
237ade0
7822d84
237ade0
7822d84
237ade0
 
 
 
 
1c0a33d
f0c6145
141ec22
7822d84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141ec22
b48943d
7822d84
1eeafb7
7822d84
 
 
 
 
1eeafb7
 
7822d84
 
 
 
 
 
 
 
 
 
cf82523
81fab61
7822d84
81fab61
7822d84
141ec22
b48943d
7822d84
1eeafb7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Fichier: /data/generate_audio.py (VERSION ANTI-BRUIT & FILTRAGE)
import sys
import os
import json
import wave 
import torch
import re

# FIX SÉCURITÉ PYTORCH
original_load = torch.load
def patched_load(*args, **kwargs):
    kwargs['weights_only'] = False
    return original_load(*args, **kwargs)
torch.load = patched_load

from TTS.api import TTS

def clean_text_pro(text):
    """Nettoyage chirurgical pour éviter les bruits de calcul"""
    # 1. Remplacer les caractères problématiques vus dans vos logs
    # Le modèle n'aime pas les accents combinés, on simplifie
    text = text.replace('̃', 'n') # Fix pour le "on" nasal
    text = text.replace('œ', 'oe')
    
    # 2. Supprimer les caractères spéciaux inutiles
    text = re.sub(r'[#@*<>]', '', text)
    
    # 3. Normaliser les espaces et la ponctuation
    text = text.replace('...', '…') # Utilise le vrai caractère de pause
    
    # 4. Ajouter un micro-espace au début et à la fin pour éviter les "clics" d'attaque
    return " " + text.strip() + " "

try:
    if len(sys.argv) < 3: sys.exit(1)
    
    input_text = sys.argv[1]
    output_file = sys.argv[2]
    processed_text = clean_text_pro(input_text)

    # Initialisation
    tts = TTS(model_name="tts_models/fr/mai/tacotron2-DDC", progress_bar=False, gpu=False)
    
    # Génération
    tts.tts_to_file(text=processed_text, file_path=output_file) 

    # --- POST-PROCESS OPTIONNEL (Si ffmpeg est nécessaire pour lisser) ---
    # On peut forcer un petit fondu (fade-in/fade-out) pour supprimer les clics
    clean_output = output_file.replace('.wav', '_clean.wav')
    os.system(f"ffmpeg -y -i {output_file} -af 'afade=t=in:ss=0:d=0.05,afade=t=out:st=13.5:d=0.1' {clean_output} > /dev/null 2>&1")
    # On remet le fichier propre à la place de l'original
    if os.path.exists(clean_output):
        os.replace(clean_output, output_file)

    with wave.open(output_file, 'rb') as wf:
        duration = wf.getnframes() / float(wf.getframerate())

    print(json.dumps({"status": "success", "audioPath": output_file, "duration": round(duration, 2)}))

except Exception as e:
    print(json.dumps({"status": "error", "message": str(e)}), file=sys.stderr)
    sys.exit(1)