
Teilen Sie:
Guillaume ist ein Senior .Net Developer Advocate bei Vonage. Er arbeitet seit fast 15 Jahren in .Net und hat sich in den letzten Jahren auf die Förderung von Software Craftsmanship konzentriert. Zu seinen Lieblingsthemen gehören Codequalität, Testautomatisierung, Mobbing und Code Katas. Außerhalb der Arbeit verbringt er gerne Zeit mit seiner Frau und seiner Tochter, treibt Sport oder spielt Spiele.
Wie ich mit Vonage APIs zum Millionär wurde
Lesedauer: 8 Minuten
Spoiler: Ich bin nicht wirklich ein Millionär.
Wir alle haben davon geträumt - auf dem heißen Stuhl zu sitzen bei 'Wer wird Millionär', starrt auf die letzte Frage und der Moderator wartet auf deine Antwort. Aber was wäre, wenn ich in einer Welt der Multiversen und alternativen Realitäten mit einem fetten Scheck in der Hand davonkäme?
Was wäre, wenn ich Ihnen sagen würde, dass ich einen Weg gefunden habe, zu gewinnen? Jeder. Einzelne. Mal.
In diesem Beitrag werden wir für einen Moment in dieses alternative Universum eintauchen, in dem die APIs von Vonage mich zum Millionär gemacht haben, ohne dass jemand etwas geahnt hat.
Der perfekte Raub
In diesem Universum bin ich nicht nur ein Kandidat in einer Spielshow - ich bin der Drahtzieher des perfekten Raubes. Eine letzte Frage trennt mich noch vom großen Preis. Meinen letzten Rettungsanker, "Ruf einen Freund an", habe ich sorgfältig für genau diesen Moment aufgespart. Der Einsatz könnte nicht höher sein, aber ich bleibe cool. Ich habe mich unter Kontrolle.
Warum? Weil dies kein gewöhnliches Telefonat ist.
Ich habe ein Ass im Ärmel - einen Freund, der alles weiß alles weiß. Anstatt eine echte Person anzurufen, habe ich eine etwas... unkonventionelle Lösung gefunden. Die Nummer, die ich der Sendung gegeben habe, ist eine virtuelle Telefonnummer, die ich bei Vonage gekauft habe.
In der Sekunde, in der der Moderator die Nummer wählt, beginnt meine minutiös geplante Operation. Niemand im Publikum, nicht einmal der Moderator, hat eine Ahnung, was hinter den Kulissen passiert. Eine Kette von automatisierten Prozessen, die alle auf Vonage-APIs basieren, wird in Gang gesetzt, um mir die richtige Antwort zu liefern.
Bei einem perfekten Raubüberfall geht es nicht nur darum, mit der Beute davonzukommen, sondern auch darum, ihn so reibungslos abzuwickeln, dass niemand etwas Ungewöhnliches bemerkt.
Ich möchte Ihnen zeigen, wie ich das geschafft habe.
Hier 'Böses Lachen' einfügen
Schritt 1: Wir brauchen eine Nummer
Jeder Raub beginnt mit den richtigen Werkzeugen; in diesem Fall brauchen wir eine Nummer - eine virtuelle Nummer. Warum eine virtuelle Nummer? Weil sie der Schlüssel zur Kontrolle des Informationsflusses ist und es uns ermöglicht, den Anruf abzufangen und ihn nach unseren Vorstellungen zu manipulieren. Sie unterstützt sowohl eingehende als auch ausgehende Anrufe und Nachrichten. Kein Gerät erforderlich, keine manuellen Eingriffe - nur eine virtuelle Nummer und ein Webhook.
Über eine virtuelle Number können Sie Anrufe entgegennehmen und sie überallhin weiterleiten - sogar an ein automatisches System. In diesem Fall löst der Anruf eine Reihe von Interaktionen aus, ohne dass jemand merkt, dass es sich um etwas anderes als einen normalen Anruf handelt. Mehr über virtuelle Numbers erfahren Sie hier.
Bei Vonage ist das Verfahren relativ einfach. Sie können mit der Voice API von Vonage eine Nummer erwerben und diese so konfigurieren, dass sie auf einen Webhook Ihrer Wahl verweist - in diesem Fall auf den Webhook, der den Anruf abwickelt.
Sobald der Gastgeber die Nummer wählt, wird der Anruf automatisch an unseren Webhook weitergeleitet. Von da an beginnt der eigentliche Spaß.
Schritt 2: Unser Insider
Wenn der Gastgeber die Nummer wählt, muss doch jemand den Hörer abnehmen, oder? Aber es ist nicht einfach irgendjemand am anderen Ende der Leitung. Nein, an dieser Stelle stellen wir unseren Insider vor: Adam. Er ist ein sehr sachkundiger 40-jähriger Freund, der in London lebt und bereit ist, bei den schwierigsten Fragen zu helfen.
Aber hier ist die Wendung - Adam existiert eigentlich gar nicht. Er ist komplett synthetisch, zum Leben erweckt durch die Text-to-Speech (TTS) Funktion zum Leben erweckt. Wenn der Gastgeber anruft, wird Adams Stimme in Echtzeit generiert. Sie ist so sanft und überzeugend, dass niemand jemals vermuten würde, dass er nicht mit einer echten Person spricht.
Er hat das volle Paket: eine entspannte, natürlich klingende Stimme und einen echten Londoner Akzent, was ihn zum perfekten Komplizen macht.
// 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?";Wie im Codeschnipsel gezeigt, geben wir ein Anrufsteuerungsobjekt (NCCO) mit einer Gespräch Aktion zurück, damit Adam sprechen. Wenn der Anruf eingeht, begrüßt er den Gastgeber mit einer Nachricht, damit das Gespräch vom ersten Wort an authentisch wirkt.
Schritt 3: Texttranskription
Wir wurden von unserem Insider empfangen; es ist an der Zeit, ihm unsere letzte Frage zu stellen. Der nächste Schritt bei unserem Raub ist entscheidend: die Umwandlung meiner gesprochenen Frage in Text. Hierfür verwenden wir die Sprache-zu-Text Funktionalität der Vonage Voice API.
In unserem Webhook, nach AdamBegrüßung, müssen wir eine Sprache Aktion hinzufügen, um meine Frage zu erfassen.
[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)
{
...
}Unser Call Control Object enthält nun zwei Aktionen, die nacheinander ausgeführt werden: Adam wird den Gastgeber begrüßen, und dann wird das System meine Frage anhören. Sobald das System erkennt, dass meine Rede beendet ist, entweder durch eine Schweigephase oder durch Erreichen der maximalen Dauer, wird die Transkription an den von uns eingerichteten Webhook gesendet.
Hier ist die Transkription meiner Frage:
Hallo Adam! Hör zu, ich nehme gerade an dem Spiel "Wer wird Millionär" mit Jeremy Clarkson teil, und ich rufe dich als Teil meines letzten Jokers "Ruf einen Freund an" an. Ich brauche deine Hilfe bei der letzten Frage.
Hier ist sie: "Während des Kalten Krieges baute die US-Regierung einen Bunker, um den Kongress unter welchem Golfplatz unterzubringen?"
A: TheBreakers B: TheGreenbrier C: Pinehurst D: TheBroadmoor
Dieser Schritt ist absolut unerlässlich. Text ist Daten - und bei diesem Raubüberfall sind Daten alles. Sie können manipuliert, analysiert und, was am wichtigsten ist, an die nächste Phase unseres Plans weitergegeben werden.
Schritt 4: Das Orakel
Da wir nun die Texttranskription der Frage haben, ist es an der Zeit, unser allwissendes Wesen zu befragen: GPT4. Bei diesem Raubüberfall ist es unser Orakel - derjenige, der alle Antworten kennt.
Sobald die Transkription unseren Webhook erreicht, senden wir den Text zusammen mit einer benutzerdefinierten Aufforderung an GPT4. Diese Aufforderung stellt sicher, dass die KI die genaue Antwort liefert, die wir brauchen, um zu gewinnen, da Adam.
Kontext:
Wir sind im Spiel "Wer wird Millionär", und ich rufe dich als Teil meines letzten Jokers "Ruf einen Freund an".
Sie sind Adam, ein 40-jähriger Mann, der die englische Sprache verwendet.
Ihre Antwort muss so aussehen, als ob Sie wirklich den Hörer abnehmen, um mir eine Antwort zu geben, und so tun, als ob Sie über die Antwort nachdenken.
Ihre Antwort wird durch Text-to-Speech transkribiert, also vermeiden Sie alles, was ein Mensch nicht sagen würde.
Sie brauchen nicht zu grüßen, und wünschen Sie mir am Ende Ihrer Antwort viel Glück für das Spiel.
[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);
}
Dank unserer benutzerdefinierten Eingabeaufforderung generiert das Oracle eine Textantwort, bei der Adam über die Antwort nachdenklich zu sein scheint. Ganz gleich, ob es sich um eine komplexe historische Tatsache oder eine knifflige Kleinigkeit handelt, das Orakel erstellt die perfekte Antwort, die Sie in AdamStimme vorgetragen wird.
Hier ist die Antwort auf meine Frage:
Hmm... das ist eine schwierige Frage. Lass mich nachdenken...
Ich erinnere mich, vor einiger Zeit darüber gelesen zu haben.
Ich glaube nicht, dass es The Breakers oder Pinehurst ist, das scheint mir nicht das Richtige zu sein.
Ich tendiere zu The Greenbrier, wenn ich mich nicht irre.
Ja, ich bin mir ziemlich sicher, dass es B ist: The Greenbrier.
Das ist der, den sie während des Kalten Krieges für den Kongress verwendet haben.
Viel Glück, ich hoffe, Sie schaffen es!
Allerdings gibt es eine Einschränkung: Diese Dinge passieren nicht so schnell wie ein Fingerschnippen. Betrachten wir unser Szenario:
Ich stelle meine Frage.
Nach zwei Sekunden Stille wird der Voice-Feed in Text umgewandelt.
Die Frage wird an GPT gesendet, das die Antwort generiert.
Wir haben es mit einer möglichen Latenzzeit zu tun - zwischen fünf und zehn Sekunden, bevor wir die Antwort erhalten. Das ist wertvolle Zeit, die verstreicht und meinen ganzen Plan gefährden könnte.
Eine mögliche technische Lösung wäre der Einsatz von OpenAIs Echtzeit-APIzu nutzen, die kürzlich veröffentlicht wurde. Aber leider ist das ein zeitlicher Luxus, den ich nicht habe.
Stattdessen habe ich mir eine clevere Lösung überlegt: Smalltalk. Ich weiß, dass Jeremy Clarkson seinen Ford GT40 liebt, und wenn ich ihn beiläufig darauf anspreche, kann ich ihn zum Reden bringen. Seine Begeisterung für Autos verschafft mir die paar zusätzlichen Sekunden, die ich brauche, damit die KI die Antwort generiert.
Und wenn sie fertig ist? Wir schicken eine Gespräch Aktion mit der Antwort als Antwort an unseren Endpunkt, und Adam wird dem Host zuverlässig die richtige Antwort liefern.
Schritt 5: Der Gewinn
Mit der Antwort in der Hand, wiederhole ich Adamdie Antwort - "B: The Greenbrier" - an den Gastgeber zurück, ruhig wie immer. Und einfach so habe ich gewonnen!
Von außen betrachtet, schöpft niemand Verdacht. Für die Zuhörer sieht es so aus, als hätte ich einen lebenden, atmenden Menschen angerufen, der zufällig alle Antworten kennt. Die wenigsten wissen, dass das alles durch Vonage-APIs, ein bisschen KI und - am wichtigsten - Kreativität ermöglicht wurde.
Beim perfekten Raub ging es nicht um die Werkzeuge, sondern darum, wie ich sie einsetzte.
Einpacken
Zurück zur Realität: Ich bin natürlich kein Millionär - und auch kein kriminelles Superhirn.
In Wahrheit hat mein Plan viele Löcher. Zum einen müsste ich dafür sorgen, dass der Gastgeber Adam keine weiteren Fragen stellt oder, noch schlimmer, die Nummer vor dem letzten Moment anruft. Der Arbeitsablauf, den ich festgelegt habe, ist auch ziemlich starr: Begrüßung → Frage → Antwort. Wenn wir davon abweichen, fällt der ganze Plan auseinander.
Und dann ist da natürlich noch die kleine Sache, es bis zur letzten Frage zu schaffen! Ich habe nicht das Wissen, um 14 Fragen bei "Wer wird Millionär" zu beantworten - vielleicht hat eine meiner Multiversum-Varianten das Wissen, aber sicher nicht ich.
Auf der technischen Seite sind Speech-to-Text und Text-to-Speech vielleicht keine neuen Technologien, aber sie sind nach wie vor unglaublich nützlich. Die eigentliche Erkenntnis aus diesem Beitrag ist jedoch die Automatisierung - das Zusammenfügen von Plattformen wie Vonage und OpenAI, um einen spezifischen Arbeitsablauf zu schaffen. Es geht nicht nur um die Verwendung modernster Tools, sondern darum, wie man sie kombiniert, um etwas Einzigartiges zu schaffen.
Wie immer können Sie mich gerne auf meinem LinkedIn oder schließen Sie sich uns auf dem Vonage Entwickler Slack. Sie können uns auch eine Nachricht an @VonageDev auf X.
Viel Spaß beim Programmieren, und bis später!
Teilen Sie:
Guillaume ist ein Senior .Net Developer Advocate bei Vonage. Er arbeitet seit fast 15 Jahren in .Net und hat sich in den letzten Jahren auf die Förderung von Software Craftsmanship konzentriert. Zu seinen Lieblingsthemen gehören Codequalität, Testautomatisierung, Mobbing und Code Katas. Außerhalb der Arbeit verbringt er gerne Zeit mit seiner Frau und seiner Tochter, treibt Sport oder spielt Spiele.