# Transcrire podcasts et vidéos avec Whisper dans WordPress

> Envoyer un fichier audio à une API de transcription, stocker le texte obtenu et générer sous-titres et contenu indexable pour le référencement du site.

- Auteur : Clément Hadrot
- Publié le : 2023-09-14
- Mis à jour le : 2023-09-14
- Catégorie : IA &amp; MCP
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ia-mcp/transcrire-podcasts-videos-whisper-wordpress/

## L’essentiel

- Envoi asynchrone en tâche de fond
- Sortie au format SRT pour les sous-titres
- Texte stocké comme contenu indexable

Un client qui publie un podcast hebdomadaire nous a demandé, un peu par lassitude, s'il existait un moyen d'arrêter de payer une prestataire pour retranscrire chaque épisode à la main avant de le publier sous forme d'article. La réponse tenait dans une API de transcription automatique, déjà largement utilisable en 2023, mais l'intégration propre dans WordPress demandait plus de réflexion que le simple appel réseau.

Ce tutoriel couvre l'envoi d'un fichier audio à une API de transcription, le traitement en tâche de fond pour ne pas bloquer l'administration, et la production d'un contenu à la fois indexable et exploitable comme sous-titres.

## Pourquoi le traitement doit être asynchrone

Un épisode de podcast d'une heure dépasse largement le temps d'exécution habituel d'une requête HTTP côté serveur. Envoyer le fichier de façon synchrone, au moment où l'éditeur clique sur « transcrire », provoque quasi systématiquement un timeout. La transcription doit donc être déclenchée puis traitée en arrière-plan, avec un statut consultable par l'éditeur pendant l'attente.

```
add_action( 'add_attachment', function ( $attachment_id ) {
    $type = get_post_mime_type( $attachment_id );

    if ( 0 === strpos( $type, 'audio/' ) ) {
        update_post_meta( $attachment_id, '_wpm_transcription_statut', 'en_attente' );
        wp_schedule_single_event( time() + 5, 'wpm_lancer_transcription', array( $attachment_id ) );
    }
} );
```

## L'envoi du fichier à l'API de transcription

Le fichier audio est envoyé en tant que fichier multipart à l'API de transcription, avec un format de sortie qui inclut les horodatages nécessaires pour générer des sous-titres, pas seulement le texte brut.

```
add_action( 'wpm_lancer_transcription', function ( $attachment_id ) {
    $chemin_fichier = get_attached_file( $attachment_id );

    $reponse = wp_remote_post( 'https://api.openai.com/v1/audio/transcriptions', array(
        'timeout'  => 120,
        'headers'  => array(
            'Authorization' => 'Bearer ' . WPM_LLM_API_KEY,
        ),
        'body'     => array(
            'file'            => curl_file_create( $chemin_fichier ),
            'model'           => 'whisper-1',
            'response_format' => 'srt',
            'language'        => 'fr',
        ),
    ) );

    if ( is_wp_error( $reponse ) ) {
        update_post_meta( $attachment_id, '_wpm_transcription_statut', 'echec' );
        return;
    }

    $srt = wp_remote_retrieve_body( $reponse );
    update_post_meta( $attachment_id, '_wpm_transcription_srt', $srt );
    update_post_meta( $attachment_id, '_wpm_transcription_statut', 'terminee' );
} );
```

> L'essentiel à retenir : Envoi asynchrone en tâche de fond ; Sortie au format SRT pour les sous-titres ; Texte stocké comme contenu indexable

## Vérifier la taille du fichier avant l'envoi

La plupart des API de transcription imposent une limite de taille de fichier, souvent autour de 25 Mo. Un épisode d'une heure encodé en qualité standard dépasse fréquemment cette limite, ce qui impose un découpage ou une compression préalable du fichier audio avant l'envoi.

- Vérifier la taille du fichier avec `filesize()` avant de lancer l'appel.
- Au-delà de la limite, découper l'audio en segments avec un outil comme ffmpeg, exécuté côté serveur, puis transcrire chaque segment séparément.
- Reconstituer un unique fichier SRT en décalant les horodatages de chaque segment suivant.

## Générer du contenu indexable à partir du SRT

Le format SRT est utile pour les sous-titres vidéo, mais reste peu lisible tel quel pour un lecteur humain ou pour le référencement. On en extrait donc une version texte continue, débarrassée des horodatages, stockée dans une métadonnée dédiée et affichée dans un onglet « Transcription » sous le lecteur audio.

```
function wpm_srt_vers_texte( $contenu_srt ) {
    $lignes = explode( "\n", $contenu_srt );
    $texte  = array();

    foreach ( $lignes as $ligne ) {
        $ligne = trim( $ligne );
        $est_numero     = ctype_digit( $ligne );
        $est_horodatage = false !== strpos( $ligne, '-->' );

        if ( '' !== $ligne && ! $est_numero && ! $est_horodatage ) {
            $texte[] = $ligne;
        }
    }

    return implode( ' ', $texte );
}
```

### Un onglet réservé à la transcription, pas un remplacement de l'épisode

Ce texte n'est volontairement pas inséré comme contenu principal de l'article, mais dans un onglet séparé : il conserve les hésitations et répétitions naturelles de l'oral, qui rendent une lecture continue fastidieuse mais qui apportent une vraie valeur pour l'accessibilité et l'indexation par les moteurs de recherche.

## Ce que ce chantier a changé pour le client

Le temps de mise en ligne d'un épisode, transcription comprise, est passé de plusieurs jours à quelques heures, la relecture humaine se concentrant désormais sur la correction des noms propres et des termes techniques que le modèle transcrit parfois de façon approximative.

> La transcription automatique ne remplace pas une relecture, mais elle change complètement ce que cette relecture coûte en temps.

## Pour aller plus loin

Cette intégration se limite volontairement à la transcription. La traduction du texte obtenu, ou son résumé automatique pour l'extrait de l'article, relèvent de traitements distincts, appliqués une fois la transcription validée par l'équipe éditoriale.
