Skip to content

Problème de transcription des messages vocaux WhatsApp via Evolution API #1685

@sacaciabesac

Description

@sacaciabesac

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions