
シェア:
ギヨームはVonageのシニア.Netデベロッパー・アドボケイト。.Netで15年近く働いているが、ここ数年はSoftware Craftsmanshipの提唱に注力している。好きなトピックは、コード品質、テスト自動化、モビング、コード・カタなど。仕事以外では、妻や娘と過ごす時間、ワークアウト、ゲームを楽しんでいる。
ヴォネージのAPIで億万長者になった方法
所要時間:1 分
ネタバレ 実は億万長者ではない.
誰もが夢見たことがあるだろう。億万長者になりたいのは誰?のホットシートに座り、最後の質問を見つめて、司会者があなたの答えを待っている。しかし、もしマルチバースと代替現実の世界で、太っ腹な小切手を手にして立ち去るとしたらどうだろう?
もし私が勝つ方法を見つけたと言ったら? すべて. シングル. 時間.
VonageのAPIは私を億万長者にしたが、誰も何も疑わなかった。
完璧な強盗
この世界では、私は単なるゲーム番組の出場者ではない。完璧な強盗の首謀者なのだ。最後の1問が、私と大賞を分ける。私はこの瞬間のために、最後の命綱である「友人を呼ぶ」を慎重に取っておいた。これ以上ない賭けだが、私は冷静だ。私は冷静だ。
なぜかって?これは普通の電話ではないからだ。
私にはエースがいる。 何でも知っている.実在の人物に電話する代わりに、ちょっと...型破りなものを用意した。私が番組に教えた番号は、Vonageから購入したバーチャル電話番号だ。
司会者が番号をダイヤルした瞬間、私の綿密に計画された作戦が始まる。観客の誰も、司会者さえも、舞台裏で何が起こっているのかわからない。VonageのAPIを利用した自動化されたプロセスの連鎖が、私に正しい答えを提供するために動き出す。
完璧な強盗とは、ただ逃げおおせることではなく、誰も異常なことが起こったことに気づかないほどスムーズにやり遂げることなのだ。
では、私がどのようにそれを成し遂げたかを紹介しよう。
ここに「邪悪な笑い」を入れる
ステップ1:番号が必要
すべての強盗は適切な道具から始まる。この場合、必要なのは番号、つまりバーチャルな番号だ。なぜバーチャル番号なのか?それは、情報の流れをコントロールする鍵であり、通話を傍受し、我々の条件で操作することを可能にするからだ。インバウンドとアウトバウンドの両方のコールとメッセージをサポートする。デバイスは必要なく、手作業も必要ありません。バーチャル番号とウェブフックだけです。
バーチャル・ナンバーを使えば、自動化されたシステムであっても、どこでも電話を受け、ルーティングすることができます。この場合、通常の電話であることに気づかれることなく、一連のやりとりが行われます。バーチャル・ナンバーについて詳しくは こちら.
具体的には、Vonageの場合、手続きは比較的簡単だ。まず Vonage Voice APIから始めることができる。で番号を購入し、選択したWebhook(この場合は通話を処理するWebhook)を指すように設定します。
ホストがその番号をダイヤルすると、通話は自動的にウェブフックに転送されます。そこからが本当の楽しみの始まりです。
ステップ2:インサイドマン
ホストが番号をダイヤルしたら、誰かが電話に出なければならないでしょう?しかし、電話の向こう側にいるのは誰でもない。いや、ここで内通者を紹介しよう: アダム.彼はロンドンに住むとても博識な40歳の友人で、難しい質問にもすぐに答えてくれる。
しかし、ここでひねりがある。 アダムは実際には存在しない。彼は完全な合成人間で、TTS(Text-to-Speech:音声合成)によって命を吹き込まれているのだ。 音声合成(TTS)機能によって命を吹き込まれている。ホストが電話をかけると、アダムの声がリアルタイムで生成され、とてもスムーズで説得力があるため、本物の人間と話していないと疑う人はいないだろう。
彼は、リラックスした自然な声の持ち主で、ロンドン訛りもあり、完璧な共犯者だ。
// 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?";コード・スニペットに示すように、私たちは コール・コントロール・オブジェクト(NCCO) を返します。 トークアクションで アダムに話させます。電話がかかってくると、ホストにメッセージを添えて挨拶し、最初の一言から本格的な会話を感じさせます。
ステップ3:文字起こし
内通者の歓迎を受け、最後の質問を彼に伝える時が来た。強盗の次のステップが重要だ:私の話し言葉の質問をテキストに変換する。このために 音声からテキストへの Vonage Voice API.
ウェブフックでは アダムの挨拶の後に スピーチ入力アクションを追加する必要があります。
[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)
{
...
}コール・コントロール・オブジェクトには、順番に実行される2つのアクションが含まれています: アダムがホストに挨拶し、システムが私の質問に耳を傾けます。Adamがホストに挨拶し、次にシステムが私の質問を聞きます。私のスピーチが終了したことをシステムが検知すると、沈黙が続くか、最大継続時間に達するかによって、書き起こしが設定したウェブフックに送信されます。
これが私の質問の書き起こしである:
やあ、アダム!僕は今、ジェレミー・クラークソンと一緒に "Who wants to be a millionaire "というゲームに参加しているんだけど、最後のジョーカー "Call a friend "の一部として君に電話しているんだ。最後の質問で君の助けが必要なんだ。
冷戦時代、アメリカ政府は何のゴルフリゾートの地下に議会を収容するためのバンカーを建設したか?
A: TheBreakers B: TheGreenbrier C: Pinehurst D:ザ・ブロードムーア
このステップは絶対に欠かせない。テキストはデータであり、この強盗においてはデータがすべてだ。それは操作され、分析され、そして最も重要なことは、我々の計画の次の段階に引き継がれることである。
ステップ4:オラクル
質問の文字起こしができたので、次は全知全能の存在に相談してみよう: GPT4.この強盗において、GPT4は私たちの神託であり、すべての答えを握っている。
書き起こしがウェブフックに届くと、カスタムプロンプトとともにテキストがGPT4に送信されます。このプロンプトは、AIが私たちが勝つために必要な正確な応答を提供することを保証します。 アダム.
コンテキスト
私たちは "大富豪になりたい人 "というゲームに参加していて、私は最後のジョーカー "友達を呼ぶ "の一部としてあなたを呼んでいる。
あなたはアダム、40歳の男性で、en-UK言語を使っている。
純粋に答えを言うために電話を取ったように見え、答えを考えるふりをしなければならない。
あなたの答えは音声合成で書き取られるので、人が言わないようなことは避けてください。
挨拶はいらないから、返信の最後に試合の成功を祈ってくれ。
[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);
}
カスタムプロンプトのおかげで、オラクルは以下のようなテキスト応答を生成する。 アダムが答えを考えているように見えます。複雑な歴史的事実であれ、トリッキーな雑学であれ、オラクルは完璧な回答を生成します。 アダムの声で伝えることができます。
私の質問に対する回答はこうだ:
うーん...難しいな。考えさせてくれ...。
少し前に読んだ覚えがある。
ブレーカーズやパインハーストではないと思う。
間違っていなければ、私はグリーンブライアーに傾いている。
ああ、B:グリーンブライヤーで間違いない。
冷戦時代に議会に使われたものだ。
幸運を祈る!
しかし、1つだけ注意点がある。これらのことは、指をパチンと鳴らすようには速く起こらないということだ。今回のシナリオを考えてみよう:
私は質問を伝える。
2秒間の沈黙の後、Voiceフィードがテキストに転写される。
質問はGPTに送られ、GPTが答えを生成する。
答えを受け取るまでに5秒から10秒の待ち時間が発生する可能性がある。それは貴重な時間であり、私の計画全体を危うくしかねない。
技術的な解決策として考えられるのは OpenAIのリアルタイムAPIに頼ることだろう。しかし残念なことに、そんな時間は僕にはない。
その代わりに、私は巧妙な回避策を考えた: スモールトーク.ジェレミー・クラークソンがフォードGT40を愛用していることは知っている。彼の車に対する熱意が、AIが答えを生成するのに必要な数秒の時間を稼いでくれるだろう。
準備ができたら?私たちは トークアクションを送信します。 アダムは自信を持って正しい答えをホストに伝える。
ステップ5:勝利
その答えを手にして、私は繰り返す。 アダムB:グリーンブライアー」と答え、ホストに返す。そしてその通り、私の勝ちだ!
外から見れば、誰も何も疑わない。聴衆には、たまたますべての答えを知っている生きた人間を呼んだように見える。彼らは知らないが、それはすべてVonageのAPIと少しのAI、そして最も重要なことだが、創造性によって動かされたのだ。
完璧な強盗は道具ではなく、それをどう使うかだった。
まとめ
現実に戻ると、私は明らかに億万長者ではないし、犯罪の首謀者でもない。
実際のところ、私の計画には穴がたくさんある。ひとつは、ホストがアダムにフォローアップの質問をしたり、最悪の場合、最後の瞬間の前にその番号に電話をかけたりしないようにしなければならないことだ。私が設定したワークフローもかなり堅苦しい:挨拶→質問→答え。そこから外れると、計画全体が崩れてしまう。
そしてもちろん、最終問題に間に合わせるという小さな問題もある!私には『億万長者になりたいのは誰だ』の14の質問に答える知識はない--私のマルチバース・バリアントの誰かが持っているかもしれないが、間違いなく私ではない。
技術的な面では、Speech-to-textとText-to-speechは新しい技術ではないかもしれないが、非常に便利な技術であることに変わりはない。しかし、この記事から得られる本当の収穫は、自動化、つまりVonageとOpenAIのようなプラットフォームをプラグインして特定のワークフローを作成することにある。最先端のツールを使うだけでなく、それらをどのように組み合わせてユニークなものを作るかが重要なのだ。
いつものように、お気軽に私の リンクトインまたは VonageデベロッパーSlack.メッセージは X の @VonageDev.
ではまた!