Spaces:
Running
Running
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) |