https://a.storyblok.com/f/270183/1368x665/7bb8d4d606/became-a-millionaire_vonage-api-ai.png

Comment je suis devenu millionnaire avec les API de Vonage

Publié le November 12, 2024

Temps de lecture : 8 minutes

Spoiler : Je ne suis pas vraiment millionnaire.

Nous en avons tous rêvé : s'asseoir sur la sellette dans l'émission "Who Wants Be Millionaire" (qui veut être millionnaire).Qui veut gagner des millionsen regardant la question finale, l'animateur attendant votre réponse. Et si, dans un monde de multivers et de réalités alternatives, je repartais avec un gros chèque en main ?

Et si je vous disais que j'ai trouvé un moyen de gagner ? Chaque. Chaque. Chaque fois.

Dans ce billet, nous allons entrer dans cet univers alternatif pour un moment - où les API de Vonage m'ont rendu millionnaire et où personne ne s'est douté de rien.

Le casse parfait

Dans cet univers, je ne suis pas qu'un simple participant à un jeu télévisé, je suis le cerveau du casse parfait. Une dernière question me sépare du grand prix. J'ai soigneusement gardé ma dernière bouée de sauvetage, "Appeler un ami", pour ce moment précis. L'enjeu ne pourrait pas être plus important, mais je suis cool. Je contrôle la situation.

Pourquoi ? Parce qu'il ne s'agit pas d'un appel téléphonique ordinaire.

J'ai un atout dans ma manche - un ami qui sait tout. Au lieu d'appeler une personne réelle, j'ai mis en place quelque chose d'un peu... non conventionnel. Le numéro que j'ai donné à l'émission est un numéro de téléphone virtuel que j'ai acheté chez Vonage.

À la seconde où l'animateur compose le numéro, mon opération minutieusement planifiée commence. Personne dans le public, pas même l'animateur, n'a la moindre idée de ce qui se passe en coulisses. Une chaîne de processus automatisés, tous alimentés par les API de Vonage, prend vie pour me fournir la bonne réponse.

Le casse parfait ne consiste pas seulement à s'en sortir, mais aussi à le réaliser si facilement que personne ne se rend compte qu'il s'est passé quelque chose d'inhabituel.

Laissez-moi vous expliquer comment j'y suis parvenue.

Insérer un "rire diabolique" ici

Étape 1 : Nous avons besoin d'un numéro

Tout casse commence avec les bons outils ; dans ce cas, nous avons besoin d'un numéro - un numéro virtuel. Pourquoi un numéro virtuel ? Parce que c'est la clé du contrôle du flux d'informations, qui nous permet d'intercepter l'appel et de le manipuler à notre guise. Il prend en charge les appels et les messages entrants et sortants. Aucun appareil n'est nécessaire, aucune intervention manuelle - il suffit d'un numéro virtuel et d'un webhook.

Un numéro virtuel vous permet de recevoir des appels et de les acheminer n'importe où - même vers un système automatisé. Dans ce cas, l'appel déclenchera une série d'interactions sans que personne ne se rende compte qu'il s'agit d'autre chose qu'un appel téléphonique normal. Pour en savoir plus sur les numéros virtuels ici.

En ce qui concerne plus particulièrement Vonage, la procédure est relativement simple. Vous pouvez commencer par l Voice API de Vonage de Vonage pour acheter un numéro et le configurer pour qu'il pointe vers un webhook de votre choix - dans ce cas, le webhook qui traitera l'appel.

Une fois que l'hôte a composé le numéro, l'appel est automatiquement acheminé vers notre crochet Web. C'est à partir de là que les choses sérieuses commencent.

Étape 2 : L'homme de l'intérieur

Lorsque l'animateur compose le numéro, quelqu'un doit décrocher le téléphone, n'est-ce pas ? Mais ce n'est pas n'importe qui à l'autre bout du fil. Non, c'est ici que nous présentons notre homme de l'intérieur : Adam. Il s'agit d'un ami de 40 ans qui vit à Londres et qui est très bien informé, prêt à répondre aux questions les plus difficiles.

Mais voici le coup de théâtre - Adam n'existe pas vraiment. Il est entièrement synthétique, animé par le système de synthèse vocale (Text-to-Speech - TTS). synthèse vocale (TTS) (Text-to-Speech). Lorsque l'hôte appelle, la voix d'Adam est générée en temps réel, et elle est si fluide et convaincante que personne ne soupçonne qu'il ne parle pas à une vraie personne.

Il a tout ce qu'il faut : une voix détendue et naturelle et un accent londonien correct, ce qui fait de lui le complice idéal.

// Our webhook
[HttpPost("answer")]
public IActionResult Answer()
{
    // Creating a Talk action with Adam's greeting message
    var talkAction = VoiceAdapter.MakeAdamTalk(GreetingsMessage);
    ...
    // Return a call control object to define the call flow 
    return this.Ok(new Ncco(talkAction, ...));
}

public static TalkAction MakeAdamTalk(string text) =>
    new TalkAction
    {
        Text = text,
        Language = "en-GB",
        Style = 6, 
        Premium = true, // Provides a more natural voice    
    };

private const string GreetingsMessage = "Adam here. What can I do for you?";

Comme le montre l'extrait de code, nous renvoyons un objet de contrôle d'appel (NCCO) avec un Parler pour que Adam parle. Lorsque l'appel arrive, il accueille l'hôte avec un message, ce qui garantit l'authenticité de la conversation dès les premiers mots.

Étape 3 : Transcription du texte

Nous avons été accueillis par notre informateur ; il est temps de lui faire part de notre dernière question. L'étape suivante de notre casse est cruciale : convertir ma question orale en texte. Pour ce faire, nous utiliserons la fonction Conversion de la parole en texte de l Voice API de Vonage.

Dans notre webhook, après Adamnous devons ajouter, après la salutation d'Adam, un élément Discours pour capturer ma question.

[HttpPost("answer")]
public IActionResult Answer()
{
    var talkAction = VoiceAdapter.MakeAdamTalk(GreetingsMessage);
    var inputAction = new MultiInputAction
    {
        Type = [NccoInputType.Speech],
        // Url where the transcription will be sent
        EventUrl = apiUrl + "/Webhooks/asr"],
        Speech = new SpeechSettings
        {
            Language = "en-GB",
            MaxDuration = 20,
            EndOnSilence = 2,
        },
    };
    return this.Ok(new Ncco(talkAction, inputAction));
}

// Webhook that will receive the text transcription
[HttpPost("asr")]
public async Task<IActionResult> Speech(MultiInput speechResponse) 
{
    ...
}

Notre objet de contrôle d'appel contient maintenant deux actions qui s'exécuteront en séquence : Adam saluera l'hôte, puis le système écoutera ma question. Dès que le système détecte que mon discours est terminé, soit par une période de silence, soit en atteignant la durée maximale, la transcription est envoyée au webhook que nous avons mis en place.

Voici la transcription de ma question :

Hé, Adam ! Je suis actuellement dans le jeu "Qui veut être millionnaire" avec Jeremy Clarkson, et je t'appelle dans le cadre de mon dernier joker "Appeler un ami". J'ai besoin de ton aide pour la dernière question.

La voici : "Pendant la guerre froide, le gouvernement américain a construit un bunker pour abriter le Congrès sous quel terrain de golf ?".

A : TheBreakers B : TheGreenbrier C : Pinehurst D : TheBroadmoor

Cette étape est absolument essentielle. Le texte est une donnée - et dans ce casse, les données sont essentielles. Elles peuvent être manipulées, analysées et, surtout, transmises à la phase suivante de notre plan.

Étape 4 : L'Oracle

Maintenant que nous avons la transcription textuelle de la question, il est temps de consulter notre entité omnisciente : GPT4. Dans ce casse, il est notre oracle - celui qui détient toutes les réponses.

Une fois que la transcription est parvenue à notre webhook, nous envoyons le texte, accompagné d'une invite personnalisée, à GPT4. Cette invite permet à l'IA de fournir la réponse précise dont nous avons besoin pour gagner, comme l'indique le tableau ci-dessous. Adam.

Contexte :

Nous sommes dans le jeu "Qui veut être millionnaire", et je vous appelle dans le cadre de mon dernier joker "Appelez un ami".

Vous êtes Adam, un homme de 40 ans qui utilise la langue anglaise.

Votre réponse doit donner l'impression que vous avez réellement décroché le téléphone pour me donner une réponse, et vous devez faire semblant de réfléchir à la réponse.

Votre réponse sera transcrite par une synthèse vocale, évitez donc tout ce qu'une personne ne dirait pas.

Inutile de me saluer et de me souhaiter bonne chance pour le match à la fin de votre réponse.

[HttpPost("asr")]
public async Task<IActionResult> Speech(MultiInput speechResponse) =>
    await FetchQuestion(speechResponse.Speech.SpeechResults)
        .MapAsync(aiAdapter.AskAsync)
        .Map(VoiceAdapter.MakeAdamTalk)
        .Map(this.Ok)
        .IfNone(this.Ok(VoiceAdapter.MakeAdamTalk(FailedToUnderstandQuestion)));

private static Maybe<string> FetchQuestion(SpeechRecognitionResult[] results) =>
    results.Length != 0 ? results.First().Text : Maybe<string>.None;

public Task<string> AskAsync(string question)
{
    var client = new ChatGpt(
        configuration["openai-key"] ?? throw new InvalidOperationException("Missing OpenAI key."),
        new ChatGptOptions { Model = "gpt-4-turbo" });
    return client.Ask(configuration["prompt"] + "\n" + question);
}

Grâce à notre invite personnalisée, l'Oracle génèrera une réponse textuelle à l'endroit suivant Adam semble réfléchir à la réponse. Qu'il s'agisse d'un fait historique complexe ou d'une anecdote délicate, il produira la réponse parfaite, prête à être livrée dans les délais impartis. Adampar la voix d'Adam.

Voici la réponse à ma question :

Hmm... c'est une question difficile. Laissez-moi réfléchir...

Je me souviens avoir lu un article à ce sujet il y a quelque temps.

Je ne pense pas qu'il s'agisse de The Breakers ou de Pinehurst, cela ne me semble pas approprié.

Je penche pour The Greenbrier, si je ne me trompe pas.

Oui, je suis presque sûr que c'est B : The Greenbrier.

C'est celui qu'ils utilisaient pour le Congrès pendant la guerre froide.

Bonne chance, j'espère que vous réussirez !

Mais il y a un bémol : ces choses n'arrivent pas aussi vite qu'un claquement de doigts. Prenons notre scénario :

  • Je pose ma question.

  • Après deux secondes de silence, le flux vocal est transcrit en texte.

  • La question est envoyée à GPT, qui génère la réponse.

Nous sommes confrontés à un temps de latence potentiel : cinq à dix secondes avant de recevoir la réponse. C'est un temps précieux qui s'écoule et qui pourrait compromettre l'ensemble de mon plan.

Une solution technique potentielle consisterait à s'appuyer sur l'API en temps réel de l'API temps réel d'OpenAId'OpenAI, qui a été publiée récemment. Mais malheureusement, c'est un luxe de temps que je n'ai pas.

Au lieu de cela, j'ai trouvé une solution astucieuse : la petite conversation. Je sais que Jeremy Clarkson adore sa Ford GT40, et si j'en parle avec désinvolture, je peux le faire parler. Son enthousiasme pour les voitures me permettra de gagner les quelques secondes supplémentaires dont j'ai besoin pour que l'IA génère la réponse.

Et une fois qu'il est prêt ? Nous envoyons un Parler avec la réponse en tant que réponse à notre point de terminaison, et Adam transmettra en toute confiance la bonne réponse à l'hôte.

Étape 5 : La victoire

Avec la réponse en main, je répète La réponse d'AdamB : The Greenbrier" - à l'animateur, toujours aussi calme. Et comme ça, j'ai gagné !

De l'extérieur, personne ne se doute de rien. Pour le public, on dirait que j'ai appelé un être humain vivant qui connaît toutes les réponses. Ils sont loin de se douter que tout cela a été possible grâce aux API de Vonage, à un peu d'intelligence artificielle et, surtout, à la créativité.

Le casse parfait n'était pas une question d'outils, mais de la manière dont je les utilisais.

Synthèse

Revenons à la réalité : je ne suis évidemment pas millionnaire, ni un génie du crime.

En réalité, mon plan comporte de nombreuses lacunes. Tout d'abord, je devrais m'assurer que l'hôte ne pose pas de questions complémentaires à Adam, ou pire, qu'il n'appelle pas le numéro avant le moment final. Le flux de travail que j'ai mis en place est également assez rigide : Accueil → Question → Réponse. Si nous nous en écartons, tout le plan tombe à l'eau.

Et, bien sûr, il y a le petit problème d'arriver jusqu'à la dernière question ! Je n'ai pas les connaissances nécessaires pour répondre aux 14 questions de "Who Wants to Be a Millionaire" - peut-être que l'une de mes variantes du multivers les a, mais certainement pas moi.

D'un point de vue technique, la synthèse vocale et la synthèse vocale ne sont peut-être pas des technologies nouvelles, mais elles restent incroyablement utiles. Cependant, le véritable intérêt de cet article réside dans l'automatisation, c'est-à-dire dans la combinaison de plateformes telles que Vonage et OpenAI pour créer un flux de travail spécifique. Il ne s'agit pas seulement d'utiliser des outils de pointe, mais de les combiner pour créer quelque chose d'unique.

Comme d'habitude, n'hésitez pas à me contacter sur mon LinkedIn ou rejoignez-nous sur le Slack des développeurs de Vonage. Vous pouvez également nous envoyer un message sur @VonageDev sur X.

Bon codage, et à plus tard !

Partager:

https://a.storyblok.com/f/270183/384x384/fdffb72c8b/guillaume-faas.png
Guillaume FaasDéveloppeur .Net Senior Advocate

Guillaume est Senior Developer Advocate chez Vonage. Il travaille dans le domaine de .Net depuis près de 15 ans et s'est concentré sur la promotion du Software Craftsmanship au cours des dernières années. Ses sujets de prédilection sont la qualité du code, l'automatisation des tests, le mobbing et les katas du code. En dehors du travail, il aime passer du temps avec sa femme et sa fille, faire de l'exercice ou jouer.