Traduire un flux rss à la volée

un script pour traduire un flux rss

Publié par sur 5th Oct 2024

Bonjour à tous,

Dans le cadre de ma veille technologique, je suis abonné à plusieurs flux RSS anglophones. Bien que la lecture en anglais ne me pose pas de problème majeur, elle nécessite néanmoins une concentration accrue, ce qui demande plus d'énergie et de temps.

Un flux RSS étant une liste d'articles parmi lesquels on sélectionne ceux qui nous intéressent, la navigation est rapide en français dans mon agrégateur (FreshRSS). En revanche, le processus est plus lent pour les contenus en anglais.

J'ai donc eu l'idée de créer une version traduite en français de ces flux. La solution s'est avérée étonnamment simple à mettre en place. Les prérequis sont :

  1. Un système Linux (dans un Docker, un VPS ou autre)
  2. Python 3.x
  3. Un endpoint d'inférence (Ollama, Groq, Together AI, OpenAI, etc.)
  4. Un serveur web basique (Apache suffit)
  5. Le script que je vais vous présenter

Dans mon cas, Linux tourne sur la même machine physique que mon instance FreshRSS (un Proxmox hébergé chez moi qui gère plusieurs services). Pour l'inférence, j'utilise habituellement une instance d'Ollama sur une machine Linux puissante équipée de deux cartes NVIDIA Quadro Pro 5000. Cependant, cette configuration étant énergivore, je ne l'active qu'en cas de besoin. Pour ce script, j'ai donc opté pour l'API compatible OpenAI de Groq, qui est gratuite et fonctionne bien avec le modèle LLaMA 3.1 70B (la version 8B devrait également convenir, moyennant un ajustement du prompt).

Voici le script en question :

import requests
import json
import sys

# Configuration de l'API compatible OpenAI
API_KEY = 'VOTRE CLE'  # Remplacez par votre clé API OpenAI
MODEL = 'llama-3.1-70b-versatile'  # Modèle de traduction à utiliser
#URL = 'https://api.openai.com/v1/chat/completions'
URL = 'https://api.groq.com/openai/v1/chat/completions'

#fonction de traduction
def traduire_texte(texte):
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {API_KEY}',
    }
    data = {
        'model': MODEL,
        'messages': [{
            'role': 'user',
            'content': f'Voici un flux rss à traduire en français. Ne traduis pas les balises. Retourne le résultat sous format RSS brut sans formatage Markdown, retourne le texte encodé en utf-8: {texte}'
        }]    
     }
    #print(texte)
    response = requests.post(URL, headers=headers, json=data)
    #print(response.text)
    return response.json()['choices'][0]['message']['content']

#fonction qui écrit le fichier rss
def ecrire_fichier_rss(articles, nom_fichier):
    with open(nom_fichier, 'w', encoding='utf-8') as f:
        f.write(articles)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: python script.py <url_flux_rss> <nom_fichier_sortie>")
        sys.exit(1)

    url_flux = sys.argv[1]
    nom_fichier_sortie = sys.argv[2]
    # Faire une requête GET à l'URL spécifiée
    response = requests.get(url_flux)

    # Vérifier si la requête a réussi
    if response.status_code == 200:
        # Charger le contenu de la page dans une variable
        page_content = response.text
        print("Contenu de la page chargé avec succès.")
    else:
        print(f"Erreur lors du chargement de la page : {response.status_code}")

    articles_traduit = traduire_texte(page_content)
    ecrire_fichier_rss(articles_traduit, nom_fichier_sortie)

voici ma ligne de crontab pour l'appeler:

10 * * * *  /usr/bin/python3 /opt/scripts/traductionrss.py https://techcrunch.com/feed /home/docker-data/apache/techcrunch.rss 2>&1

Une fois le script en place, il suffit de s'abonner à l'URL http://192.168.2.202:8880/techcrunch.rss dans FreshRSS, par exemple.

Ce script, bien que rudimentaire, me rend déjà un grand service. Je surveillerai son efficacité et sa fiabilité à l'usage, et l'améliorerai si nécessaire.

N'hésitez pas à partager vos retours ou suggestions d'amélioration !

publié initialement ici