-
Notifications
You must be signed in to change notification settings - Fork 4.9k
Description
Bonjour à tous, je développe une application qui transcrit les messages vocaux WhatsApp en utilisant Evolution API comme intermédiaire et l'API Whisper d'OpenAI pour la transcription. Je rencontre des problèmes lors de la conversion des fichiers audio reçus de WhatsApp avant de les envoyer à l'API Whisper.
Je précise que j'ai développé le même processus pour Telegram et que tout fonctionne à merveille sur Telegram.
Architecture actuelle
WhatsApp envoie un message vocal
Evolution API reçoit le message et me notifie via webhook
Mon webhook PHP télécharge le fichier audio depuis l'URL fournie par Evolution API
Mon script Python tente de convertir le fichier OGG/OPUS en MP3 pour la transcription
Le fichier MP3 est envoyé à OpenAI Whisper API pour transcription
Problème spécifique
Les fichiers audio téléchargés depuis Evolution API (avec le paramètre encoding=true) ne peuvent pas être correctement convertis en MP3 avec ffmpeg. J'obtiens systématiquement des erreurs "End of file" ou des fichiers MP3 illisibles.
Détails techniques
Téléchargement du fichier audio (PHP)
php
function downloadAudioFile($url, $outputPath, $logFile = null) {
// Ajouter le paramètre encoding=true à l'URL pour les fichiers audio WhatsApp
$url = $url . (strpos($url, '?') !== false ? '&' : '?') . 'encoding=true';
$ch = curl_init($url);
$fp = fopen($outputPath, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$success = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$fileSize = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);
curl_close($ch);
fclose($fp);
return $success && $httpCode == 200 && $fileSize > 0;
}
Tentative de conversion avec ffmpeg (Python)
python
def convert_audio_to_mp3(input_file):
with tempfile.NamedTemporaryFile(suffix='.mp3', delete=False) as temp_mp3_file:
output_file = temp_mp3_file.name
cmd = ['ffmpeg', '-y', '-i', input_file, '-acodec', 'libmp3lame', '-ab', '192k', output_file]
try:
process = subprocess.run(cmd, capture_output=True, text=True)
if process.returncode != 0:
logger.error(f"Erreur lors de la conversion avec ffmpeg: {process.stderr}")
return None
return output_file
except Exception as e:
logger.error(f"Erreur lors de la conversion audio: {str(e)}")
return None
Erreur ffmpeg
ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 13 (Ubuntu 13.2.0-23ubuntu3)
configuration: --prefix=/usr --extra-version=3ubuntu5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
[ogg @ 0x569e4dd20800] Format ogg detected only with low score of 1, misdetection possible!
[in#0 @ 0x569e4dd20700] Error opening input: End of file
Error opening input file /tmp/tmpoommbft_.ogg.
Error opening input files: End of file
Approches que j'ai tentées
Conversion directe OGG → MP3 : Échec avec erreur "End of file"
Encodage/décodage base64 :
- Encodage du fichier OGG en base64
- Décodage en fichier temporaire
- Tentative de conversion en MP3
--> Résultat : même erreur "End of file"
Options ffmpeg avancées :
- Forçage du format d'entrée avec -f ogg
- Paramètres audio spécifiques (-ar 44100, -ac 1)
--> Résultat : échec similaire
Tentative avec n8n :
- Configuration d'un webhook n8n pour la conversion
- Envoi du fichier via URL ou base64
--> Résultat : erreur "The value in 'base64' is not set"
Mon environnement
Serveur : Ubuntu avec ffmpeg 6.1.1
Evolution API : Version la plus récente
PHP : 8.3.2
Python : 3.x avec bibliothèques OpenAI, subprocess, tempfile, base64
Questions
Le paramètre encoding=true modifie-t-il le format du fichier audio d'une manière qui le rend incompatible avec ffmpeg ?
Existe-t-il une méthode recommandée pour obtenir les fichiers audio WhatsApp depuis Evolution API dans un format directement utilisable par Whisper ?
Y a-t-il des paramètres spécifiques à utiliser avec ffmpeg pour convertir correctement les fichiers audio provenant d'Evolution API ?
Evolution API offre-t-il une API pour obtenir directement le fichier audio converti en MP3 ou dans un format compatible avec Whisper ?
Toute aide ou suggestion serait grandement appréciée. Je suis prêt à fournir des informations supplémentaires si nécessaire.