Spaces:
Sleeping
Sleeping
Update data/generate_audio.py
Browse files- data/generate_audio.py +32 -15
data/generate_audio.py
CHANGED
|
@@ -1,30 +1,47 @@
|
|
|
|
|
| 1 |
import sys
|
| 2 |
import torch
|
| 3 |
import soundfile as sf
|
| 4 |
from transformers import VitsModel, AutoTokenizer
|
| 5 |
|
| 6 |
-
#
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
| 8 |
|
| 9 |
-
#
|
| 10 |
-
#
|
| 11 |
-
|
| 12 |
-
tokenizer = AutoTokenizer.from_pretrained("facebook/mms-tts-fra")
|
| 13 |
|
| 14 |
-
#
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
model.to(device)
|
| 17 |
|
| 18 |
-
#
|
| 19 |
inputs = tokenizer(text, return_tensors="pt").to(device)
|
| 20 |
|
| 21 |
-
|
| 22 |
-
with torch.no_grad():
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
-
#
|
| 26 |
-
# L'audio est sauvegardé dans le format WAV nécessaire au nœud FFmpeg suivant
|
| 27 |
output_file = "generated_audio.wav"
|
|
|
|
| 28 |
sf.write(output_file, output.cpu().numpy(), model.config.sampling_rate)
|
| 29 |
|
| 30 |
-
|
|
|
|
|
|
|
|
|
| 1 |
+
# Fichier: /data/generate_audio.py
|
| 2 |
import sys
|
| 3 |
import torch
|
| 4 |
import soundfile as sf
|
| 5 |
from transformers import VitsModel, AutoTokenizer
|
| 6 |
|
| 7 |
+
# 1. Vérifie si le texte est fourni en argument
|
| 8 |
+
if len(sys.argv) < 2:
|
| 9 |
+
# Affiche l'erreur sur la sortie d'erreur (stderr) pour n8n
|
| 10 |
+
print("Usage: python3 generate_audio.py \"Votre texte ici\"", file=sys.stderr)
|
| 11 |
+
sys.exit(1)
|
| 12 |
|
| 13 |
+
# Le premier argument est le texte à synthétiser
|
| 14 |
+
# Nous utilisons une substitution simple pour les guillemets internes
|
| 15 |
+
text = sys.argv[1].replace('"', '')
|
|
|
|
| 16 |
|
| 17 |
+
# 2. Charger le modèle et le tokenizer (TTS Français)
|
| 18 |
+
# Utilisation du CPU par défaut pour les Spaces gratuits
|
| 19 |
+
try:
|
| 20 |
+
model = VitsModel.from_pretrained("facebook/mms-tts-fra")
|
| 21 |
+
tokenizer = AutoTokenizer.from_pretrained("facebook/mms-tts-fra")
|
| 22 |
+
except Exception as e:
|
| 23 |
+
print(f"Erreur de chargement du modèle : {e}", file=sys.stderr)
|
| 24 |
+
sys.exit(1)
|
| 25 |
+
|
| 26 |
+
# Définir l'appareil (CPU uniquement)
|
| 27 |
+
device = torch.device("cpu")
|
| 28 |
model.to(device)
|
| 29 |
|
| 30 |
+
# 3. Génération de l'audio
|
| 31 |
inputs = tokenizer(text, return_tensors="pt").to(device)
|
| 32 |
|
| 33 |
+
try:
|
| 34 |
+
with torch.no_grad():
|
| 35 |
+
output = model(**inputs).waveform.float()
|
| 36 |
+
except Exception as e:
|
| 37 |
+
print(f"Erreur de génération du waveform : {e}", file=sys.stderr)
|
| 38 |
+
sys.exit(1)
|
| 39 |
|
| 40 |
+
# 4. Sauvegarde de l'audio dans le répertoire de travail /data
|
|
|
|
| 41 |
output_file = "generated_audio.wav"
|
| 42 |
+
# Utiliser output_file seulement (car /data est déjà le WORKDIR)
|
| 43 |
sf.write(output_file, output.cpu().numpy(), model.config.sampling_rate)
|
| 44 |
|
| 45 |
+
# 5. Imprimer le chemin complet du fichier (utile pour n8n)
|
| 46 |
+
# Nous retournons le chemin d'accès au fichier pour les nœuds suivants
|
| 47 |
+
print(f"/data/{output_file}")
|