Blog technique
avril 29, 2024

Créez Votre Podcast Personnalisé Avec Jina Reader et PromptPerfect

Utilisez Jina Reader et PromptPerfect pour générer votre podcast d'actualités personnalisé avec des flux RSS, l'extraction d'articles, les LLM et la synthèse vocale.
Alex C-G • 9 minutes lues

Comme beaucoup de gens, j'écoute de nombreux podcasts. Certains parlent de science-fiction. D'autres de paléontologie. Et d'autres encore de types bizarres du Moyen Âge. Pas de true crime malheureusement, à part mon goût parfois douteux.

🎧
Ce qui n'est pas de mauvais goût (bien sûr) est le podcast de Jina AI. N'oubliez pas de l'écouter !

Mais... c'est fastidieux d'écouter tous ces podcasts. Et ce n'est pas le pire. Je suis aussi abonné à beaucoup de flux d'actualités. Et cela peut faire beaucoup de lecture. Ce serait fantastique si je pouvais simplement prendre tout le contenu de ces flux d'actualités, le résumer en cinq minutes et faire en sorte que mon téléphone me le lise pendant que je me brosse les dents le matin.

🏥
Les dentistes ne recommandent probablement pas de se brosser les dents pendant cinq minutes complètes. Le blog de Jina AI ne doit pas être considéré comme une source de conseils médicaux. Certains d'entre nous sont docteurs, mais pas ce genre de docteur.

Vous devinez probablement où je veux en venir. J'utilise Python pour créer un outil avec (principalement) la stack technologique de Jina pour créer mon podcast quotidien personnalisé d'actualités.

Si vous voulez passer directement à l'écoute, vous pouvez l'entendre ci-dessous :

audio-thumbnail
Output
0:00
/1:19

tagQu'est-ce qu'un flux d'actualités ?

Tout d'abord, je les appelle « flux d'actualités » car la plupart des gens ne sont pas familiers avec les termes RSS ou Atom feeds. En bref, un flux est une liste structurée d'articles publiés par un blog ou une source d'actualités, classés du plus récent au plus ancien. De nombreux sites les proposent, et il existe plusieurs applications et sites web qui vous permettent d'importer tous vos flux, vous permettant de lire toutes vos actualités dans une seule application, sans avoir à visiter les sites web d'Ars Technica, des sites de fans de Taylor Swift, et du Washington Post :

Screenshot image 8
Feeder lecteur de flux sur Android, montrant le flux d'Ars Technica. Notez la mise en page simple, sans publicités ni éléments superflus

C'est une technologie ancienne du web préhistorique, mais de nombreux sites web la prennent en charge, y compris le blog de Jina AI (voici notre flux).

💡
Pour les sites qui n'ont pas leurs propres flux, il existe des outils tiers pour les générer.

En bref, les flux vous permettent de lire toutes vos actualités en un seul endroit, en évitant tous les éléments parasites et les publicités. Dans cet article, nous utiliserons les flux d'actualités pour trouver et télécharger les derniers articles des sites que nous suivons.

tagLançons cette frénésie d'alimentation

💡
Le code dans cet article est une version simplifiée de ce que vous trouverez dans le notebook. Nous n'allons pas nous embêter avecLes pip install et les clés de configuration se trouvent dans ce post. Si vous souhaitez suivre, consultez le notebook pour l'expérience complète et gardez ce post pour avoir une vue d'ensemble.

Lien Colab | Lien GitHub

Pour réaliser cette magie, nous allons utiliser plusieurs services et bibliothèques Python :

  • Feedparser : Une bibliothèque Python pour télécharger et extraire le contenu des flux d'actualités.
  • Jina Reader : L'API de Jina pour extraire uniquement le contenu de chaque article, sans télécharger les éléments superflus comme les en-têtes, pieds de page et barres latérales.
  • PromptPerfect : Prompts-as-Services résumera chaque article puis combinera ces résumés en un seul paragraphe, dans le style d'un présentateur de NPR.
  • gTTS : La bibliothèque Text-to-Speech de Google, pour lire les actualités à voix haute.

C'est tout ce que nous couvrirons dans ce post. Si vous souhaitez créer un flux podcast pour votre podcast personnalisé, nous vous suggérons de consulter d'autres sources.

tagTéléchargement des Flux

Comme il s'agit d'un exemple simple, nous nous contenterons de quelques flux d'actualités de The Register et OSNews, deux sites d'actualités tech.

feed_urls = [
    "https://www.osnews.com/feed/",
    "https://www.theregister.com/headlines.atom"
]

Avec Feedparser, nous pouvons télécharger les flux puis extraire les liens des articles de chaque flux :

import feedparser

for feed_url in feed_urls:
    feed = feedparser.parse(feed_url)
    for entry in feed["entries"]:
        page_urls.append(entry["link"])

tagExtraction du Texte des Articles avec Jina Reader

Chaque flux contient des liens vers chaque article sur le site web correspondant. Si nous téléchargeons simplement cette page web, nous obtenons beaucoup de HTML, y compris les barres latérales, en-têtes, pieds de page et autres éléments superflus dont nous n'avons pas besoin. Si vous donnez cela à un LLM, c'est comme si vous mâchiez de l'herbe. Certes, le LLM peut le faire, mais ce n'est pas ce qu'il veut naturellement consommer.

Ce qu'un LLM veut vraiment, c'est quelque chose proche du texte brut. Jina Reader convertit un article en Markdown.

Reader API
Lisez n'importe quelle URL en texte compatible LLM instantanément, sans tracas.

Cela le fait ressembler à ceci :

Title: Unintended acceleration leads to recall of every Cybertruck produced so far

URL Source: https://www.theregister.com/2024/04/19/tesla_recalls_all_3878_cybertrucks/?td=rt-3a

Published Time: 2024-04-19T13:55:08Z

Markdown Content:
Tesla has issued a recall notice for every single Cybertruck it has produced thus far, a sum of 3,878 vehicles.

Today's [recall notice](https://static.nhtsa.gov/odi/rcl/2024/RCLRPT-24V276-7026.PDF) \[PDF\] by the National Highway Traffic Safety Administration states that Cybertrucks have a defect on the accelerator pedal, which can get wedged against the interior of the car, keeping it pushed down. The pedal actually comes in two parts: the pedal itself and then a longer piece on top of it. That top piece can become partially detached and then slide off against the interior trim, making it impossible for the pedal to lift up. This defect [was already suspected](https://www.theregister.com/2024/04/15/tesla_lays_off_10_percent/) as Tesla paused production of the Cybertruck due to an "unexpected delay." Some Cybertruck owners also spoke on social media about their vehicles uncontrollably accelerating, with one crashing into a pole and another demonstrating [on film](https://www.tiktok.com/@el.chepito1985/video/7357758176504089898) how exactly the pedal breaks and gets stuck.
...

Nous avons raccourci ceci car inclure l'article entier serait excessif. Mais vous pouvez voir que c'est un texte clair et lisible (markdown).

Au lieu de ceci :

<!doctype html>
<html lang="en">
<head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>Unintended acceleration leads to recall of every Cybertruck • The Register</title>
    <meta name="robots" content="max-snippet:-1, max-image-preview:standard, max-video-preview:0">
    <meta name="viewport" content="initial-scale=1.0, width=device-width"/>
    <meta property="og:image" content="https://regmedia.co.uk/2019/11/22/cybertruck.jpg"/>
    <meta property="og:type" content="article" />
    <meta property="og:url" content="https://www.theregister.com/2024/04/19/tesla_recalls_all_3878_cybertrucks/" />
    <meta property="og:title" content="Unintended acceleration leads to recall of every Cybertruck" />
    <meta property="og:description" content="That isn&#39;t what Tesla meant by Full Self-Driving" />
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:site" content="@TheRegister">
<script type="application/ld+json">
...

Nous avons dû couper court avant même d'arriver au contenu réel. Il y a tellement d'éléments illisibles pour l'humain.

En donnant au LLM quelque chose qu'il peut digérer plus naturellement (comme du markdown plutôt que du HTML), il peut nous donner de meilleurs résultats. Sinon, c'est comme donner des Doritos à un lion. Certes, il peut les manger, mais il ne sera pas son meilleur lui-même lion s'il maintient ce régime.

Pour extraire uniquement le texte de manière lisible, nous utiliserons l'API de Jina Reader :

import requests

articles = []

for url in page_urls:
    reader_url = f"https://r.jina.ai/{url}"
    article = requests.get(reader_url)
    articles.append(article.text)
💡
Vous pouvez voir la sortie lisible directement dans votre navigateur web en allant sur https://r.jina.ai/<url>, par exemple https://r.jina.ai/https://www.theregister.com/2024/04/19/wing_commander_windows_95/

tagRésumer les articles avec PromptPerfect

Comme il peut y avoir beaucoup d'articles, nous utiliserons un LLM pour résumer chacun séparément. Si nous les rassemblons tous et les donnons au LLM pour les résumer, il pourrait s'étouffer avec trop de tokens à la fois.

Cela variera en fonction du nombre d'articles que vous souhaitez traiter. Pour quelques-uns seulement, il peut être utile de les concaténer tous en une longue chaîne et de faire un seul appel, gagnant ainsi du temps et de l'argent. Cependant, pour cet exemple, nous supposerons que nous traitons un plus grand nombre d'articles.

Pour les résumer, nous utiliserons un Prompt-as-a-Service de PromptPerfect.

Quelle est la prochaine étape pour l'Ingénierie des Prompts ? Le Prompt as a Service de PromptPerfect !
Déployez des prompts et des modèles de prompts flexibles comme services REST API, et intégrez-les dans vos applications en quelques clics

Voici notre Prompt-as-Service :

image
Notre Prompt-as-Service pour résumer les articles

Nous allons écrire une fonction pour cela, car nous appellerons un autre Prompt-as-Service plus tard dans cet article :

def get_paas_response(id, template_dict):
    url = f"https://api.promptperfect.jina.ai/{id}"
    headers = {
        "x-api-key": f"token {PROMPTPERFECT_KEY}",
        "Content-Type": "application/json"
    }
        response = requests.post(url, headers=headers, json={"parameters": template_dict})
        
    if response.status_code == 200:
        text = response.json()["data"]
        return text
    else:
        return response.text

Nous allons ensuite prendre chaque résumé et les ajouter à une liste, pour finalement les concaténer en une liste markdown à puces :

summaries = []

for article in articles:
    summary = get_paas_response(
        prompt_id="mkuMXLdx1kMU0Xa8l19A", 
        template_prompt={"article": article}
    )
    summaries.append(summary)
    
concat_summaries = "\n- ".join(summaries)

tagGénérer un rapport d'actualités avec PromptPerfect

Maintenant que nous avons cette liste à puces, nous pouvons l'envoyer à un autre Prompt-as-a-Service pour générer un bulletin d'information qui sonne comme un discours naturel de présentateur :

image
Notre Prompt-as-Service pour combiner les résumés en un rapport d'actualités cohérent

Le prompt complet est :

Vous êtes un rédacteur en chef des actualités technologiques de NPR. Vous avez reçu les résumés d'actualités suivants :

[summaries]

Votre tâche est de donner un aperçu en un paragraphe des actualités, couvrant chaque élément de manière organique, avec des transitions vers l'élément suivant. Vous pouvez modifier l'ordre des éléments si cela a du sens, et fusionner les doublons.

Vous produirez un script d'un paragraphe qui sonne naturel, à lire sur les actualités quotidiennes de NPR. Le script ne devrait pas prendre plus de cinq minutes à lire à voix haute.

Nous obtiendrons le script d'actualités avec ce code :

news_script = get_paas_response(
    prompt_id="tmW07mipzJ14HgAjOcfD",
    template_prompt={"summaries": concat_summaries}
)

Voici le texte final :

Dans l'actualité technologique d'aujourd'hui, nous avons une série de mises à jour et de développements à aborder. Tout d'abord, l'outil Tiny11 Builder offre aux utilisateurs la possibilité d'alléger Windows 11 en créant une image personnalisée adaptée à leurs préférences. Passant au monde du jeu vidéo, nous explorons les composants cachés à l'intérieur des cartouches Super Nintendo, mettant en lumière la technologie qui fascinait les joueurs dans les années 90. Changeant de registre pour parler des logiciels, le gestionnaire de fenêtres en mosaïque Niri pour Wayland a publié une mise à jour majeure, offrant de nouvelles fonctionnalités comme le défilement infini et des animations améliorées. Dans le domaine de l'IA, la fonctionnalité Copilot de Microsoft a rencontré quelques difficultés lors de son déploiement auprès des Windows Insiders, avec des bugs et un comportement intrusif qui ont conduit à l'arrêt du déploiement. Pendant ce temps, le Bureau du Commissaire à l'Information du Royaume-Uni soulève des inquiétudes concernant le Privacy Sandbox de Google, questionnant ses implications en matière de confidentialité et son impact sur la concurrence. Enfin, l'Administration Fédérale de l'Aviation des États-Unis a mis à jour ses exigences en matière de licence de lancement, exigeant désormais que les véhicules de rentrée obtiennent une licence avant le lancement, suite à un incident impliquant Varda Space Industries. Ces diverses histoires technologiques mettent en évidence les progrès et les défis continus dans le monde de la technologie.

tagLire les actualités à voix haute

Pour lire le texte à voix haute, nous utiliserons la bibliothèque TTS de Google.

gTTS
gTTS (Google Text-to-Speech), une bibliothèque Python et un outil CLI pour interagir avec l'API text-to-speech de Google Translate
from gtts import gTTS

tts = gTTS(news_script, tld="us")
tts.save("output.mp3")

Cela nous donnera un fichier audio final :

audio-thumbnail
Output
0:00
/1:19
Pourquoi n'avons-nous pas opté pour une approche TTS basée sur un modèle ? Deux raisons : premièrement, lors de nos tests avec Bark, nous avons fréquemment rencontré des hallucinations en lui envoyant plus de six phrases environ. Il n'a même pas commencé à halluciner après six phrases – les hallucinations ont commencé très tôt, insérant des nombres et des mots sans sens dès que nous lui transmettions trop d'informations. Deuxièmement, utiliser une bibliothèque plutôt qu'une API signifie une clé d'API de moins à obtenir.

tagProchaines étapes

Nous n'allons pas couvrir le reste de l'expérience de création de podcast dans cet article. Ce n'est pas notre domaine d'expertise, et tout comme pour les conseils médicaux, vous ne devriez probablement pas nous écouter concernant les détails techniques de la configuration d'un flux podcast, de sa mise en ligne sur Spotify, Apple Podcasts, etc. Pour des conseils médicaux ou sur les podcasts, consultez respectivement votre médecin ou Joe Rogan.

Quant aux autres possibilités de Jina Reader, pensez à toutes les applications RAG que vous pouvez créer en téléchargeant des versions lisibles de n'importe quelle page web. Ou pour PromptPerfect, découvrez comment il peut aider davantage les YouTubers (ou les marketers, si c'est votre truc.)

Catégories:
Blog technique

En savoir plus
mars 11, 2026 • 7 minutes lues
Bootstrapping Audio Embeddings from Multimodal LLMs
mars 06, 2026 • 6 minutes lues
Identifying Embedding Models from Raw Numerical Values
septembre 09, 2025 • 11 minutes lues
Multimodal Embeddings in Llama.cpp and GGUF