Salut à tous,
Je construis un workflow dans n8n pour un projet de cours et je suis bloqué à l’étape finale de la transcription audio.
L’objectif est de :
Recevoir un message vocal de Telegram
Télécharger l’audio en utilisant Telegram → Get a File (via file_id)
Convertir l’audio en texte (reconnaissance vocale)
Envoyer la transcription à un agent IA
Question
Quelle est la façon recommandée et fiable dans n8n de : prendre un message vocal Telegram (.oga / opus) l’envoyer à une API de reconnaissance vocale non-OpenAI (p. ex. Groq Whisper ou similaire) et obtenir une sortie de transcription stable
Particularièrement intéressé par :
les meilleures pratiques pour gérer les fichiers audio binaires de Telegram
si there is a known limitation with multipart/form-data in HTTP Request node
le contournement recommandé si le chargement binaire direct n’est pas fiable
N’importe quel pattern de travail ou exemple de workflow serait très apprécié
Quel est le message d’erreur (le cas échéant) ?
Où je suis bloqué
À cette étape :
Telegram → Get a File fonctionne correctement
Je reçois le fichier audio binaire (.oga, audio/ogg)
Le workflow s’arrête lorsque j’essaie d’envoyer ce fichier à une API Whisper/STT
J’ai testé plusieurs approches :
HTTP Request node avec Form-Data + fichier binaire
Code node avec fetch + FormData
différents mappages binaires dans n8n
Mais j’obtiens toujours des erreurs comme :
file must be one of [flac mp3 mp4 mpeg mpga m4a ogg opus wav webm]
file not received
problèmes multipart/form-data
invalid request / bad request
À ce stade, je peux télécharger le fichier avec succès, mais je ne peux pas l’envoyer de manière fiable à une API de transcription.
Veuillez partager votre workflow
Workflow attendu (d'après le tutoriel)
Le tutoriel que je suis suggère :
Telegram → Get a File
OpenAI → Whisper → Transcribe a Recording
Connectez la sortie Whisper à un agent IA
Utilisez cette expression dans l'agent IA :
{{$json.message.text ?? $node["OpenAI"].json.text}}
Ainsi, l'agent peut gérer :
les messages texte
les transcriptions audio
MAIS je n'utilise pas OpenAI !!
Je veux éviter d'utiliser OpenAI (raisons de coût), donc j'essaie d'utiliser une solution alternative de reconnaissance vocale (p. ex. Groq Whisper API ou similaire).
Partagez la sortie retournée par le dernier nœud
Informations sur votre configuration n8n
Version n8n: 2.23.4
Base de données (par défaut : SQLite) : par défaut
D’abord, supprime le nœud Code avec fetch/FormData, c’est fragile pour les fichiers binaires. Utilise le nœud HTTP Request : mets Body sur Form-Data, ajoute un paramètre nommé file avec le type n8n Binary File, et définis Input Data Field Name sur ta propriété binaire, généralement data. Ajoute un champ model défini sur whisper-large-v3, et pointe-le sur le endpoint de Groq https://api.groq.com/openai/v1/audio/transcriptions avec un en-tête token Bearer.
Ensuite, l’erreur « file must be one of » concerne le nom de fichier, pas l’audio. Whisper lit le format à partir de l’extension, et Telegram envoie .oga, qui ne figure pas sur la liste. Renomme le nom de fichier du binaire pour qu’il se termine par .ogg et cette erreur disparaît.
Ensuite, dans le nœud HTTP Request, définissez Body sur Form-Data, ajoutez un paramètre file avec le type « n8n Binary File », Input Data Field Name = data, et ajoutez model en tant que champ de chaîne défini sur whisper-large-v3. Cette combinaison fonctionne constamment avec le point de terminaison de Groq.
Bonne nouvelle : votre fichier est correct - .oga est bien ogg/opus, qui figure déjà dans cette liste autorisée. L’erreur « file must be one of […ogg opus…] » est trompeuse : Groq/OpenAI Whisper détectent le format à partir de l’EXTENSION DU NOM DE FICHIER dans l’upload multipart, et la fonction « Get a File » de Telegram donne au binaire un nom sans extension utilisable. Vous envoyez les octets correctement, mais l’API les rejette parce que le nom de fichier de la partie n’est pas *.ogg. Corrigez le nom de fichier et ça marche - aucune conversion nécessaire.
Étape 1 - corriger le nom de fichier binaire. Juste après Telegram -\u003e Get a File, ajoutez un nœud Code (Run Once for Each Item)
item.binary.data.fileName = 'audio.ogg';
item.binary.data.mimeType = 'audio/ogg';
return item;
```
(utilisez le nom de votre propriété binaire - c'est généralement `data`).
Étape 2 - envoyer à Groq avec le nœud HTTP Request (utilisez le nœud natif, pas un nœud Code + fetch - le nœud natif construit correctement le multipart) :
- Method : POST
- URL : https://api.groq.com/openai/v1/audio/transcriptions
- Authentication -\u003e Generic -\u003e Header Auth : name `Authorization`, value `Bearer YOUR_GROQ_KEY`
- Send Body : ON, Body Content Type : Form-Data (multipart/form-data)
- Parameters :
- `file` -\u003e Parameter Type : n8n Binary File (les versions plus anciennes l'appellent « Form Binary Data ») -\u003e Input Data Field Name : `data`
- `model` -\u003e (form field) -\u003e whisper-large-v3 (ou whisper-large-v3-turbo)
- optional `response_format` -\u003e json
C'est tout. Groq est compatible avec OpenAI, rapide et offre un niveau gratuit généreux - parfait pour éviter OpenAI sur le coût.
Étape 3 - l'expression AI Agent, changez juste le nom du nœud :
`{{ $json.message.text ?? $node["HTTP Request"].json.text }}`
(Groq retourne la transcription dans `.text`, même structure que OpenAI.)
Les pièges qui causent vos erreurs exactes :
- « file not received » -\u003e le paramètre Form-Data doit être de type Binary File, pas un champ texte, et Input Field Name doit correspondre à la propriété binaire (`data`).
- « file must be one of [...] » -\u003e extension de nom de fichier vide/manquante -\u003e le renommage du nœud Code le corrige.
- NE définissez PAS manuellement un en-tête `Content-Type: multipart/...` - laissez n8n définir la limite automatiquement ; une limite manuelle casse la requête.
Stable sur n8n cloud 2.23.x.
Pour confirmer ce que @work6 a expliqué, c’est le modèle de fonctionnement complet. Une chose à ajouter si vous recevez toujours « fichier non reçu » même après le renommage :
Le nœud Get a File de Telegram renvoie parfois application/octet-stream comme type MIME au lieu de audio/ogg. L’API de Groq peut le rejeter. Forcez les deux champs dans votre nœud Code :
item.binary.data.fileName = 'audio.ogg';
@Work6 a inclus cela, je m’assure simplement que ce ne soit pas oublié car c’est facile à manquer.
Aussi, pour l’expression AI Agent, si votre nœud HTTP Request a un nom personnalisé, mettez-le à jour en conséquence.
Salut @SilvyElba — cette danse .oga + multipart/form-data manuelle est vraiment la partie douloureuse quand on choisit la route HTTP brute. Le renommage .oga → .ogg + la correction Form-Data ci-dessus est solide si tu veux rester sur Groq.
Si tu es ouvert à une option gérée multi-fournisseurs qui contourne entièrement la tuyauterie binaire, voici un autre angle.
Divulgation : je travaille chez Eden AI, donc prends ceci comme une option parmi d’autres — mais ça résout exactement ton blocage, donc j’ai pensé que ça valait la peine de partager.
Eden AI est un agrégateur (une API/clé en face de Deepgram, AssemblyAI, Gladia, Amazon, Google, Whisper…), et il y a un nœud communautaire : n8n-nodes-edenai. La partie pertinente pour toi : son nœud Expert Models prend une propriété binaire directement et télécharge le fichier pour toi — pas de Form-Data manuel, pas de renommage .oga, pas de « fichier non reçu ».
Recette rapide :
Settings → Community Nodes → Installn8n-nodes-edenai (et ajoute ta clé API Eden AI comme identifiant).
Telegram Trigger → Telegram (Get File) pour que tu aies le fichier vocal en tant que binaire.
Nœud Eden AI – Expert Models :
Feature :audio
Subfeature :speech to text (async) — c’est un travail asynchrone, le nœud interroge jusqu’à ce qu’il soit terminé automatiquement.
Input Type :File → File Source :Binary Property → pointe-le vers ton champ binaire Telegram (par ex. data). C’est la totalité de la partie « gestion binaire ».
Provider : choisis celui que tu préfères — Deepgram et Gladia sont rapides/économiques, AssemblyAI est fort sur la précision + diarisation. Tu peux changer de fournisseur via un menu déroulant sans re-configurer quoi que ce soit.
(Optionnel) Définis quelques Fallback Models dans Options, pour que si ton fournisseur principal a une erreur, il réessaie avec le suivant — pratique pour ce genre d’instabilité 4xx que tu rencontres.
La transcription revient dans la sortie du nœud (pas besoin de gérer la réponse multipart toi-même).
Sur le coût, puisque c’est ta raison principale de quitter OpenAI : Eden AI facture la tarification au prix de passage du fournisseur — aucune marge sur le prix par requête. La seule marge est d’environ 5,5 %, appliquée quand tu recharges des crédits. Tu ne battras donc pas Groq-direct sur le prix brut, mais tu peux choisir le fournisseur le moins cher par travail (Deepgram/Gladia sont très compétitifs) et basculer librement d’un nœud. Le vrai gain ici, c’est d’éliminer les tracasseries binaires/form-data + la flexibilité multi-fournisseur & fallback. Je serai heureux de partager un exemple de workflow JSON si utile.