https://a.storyblok.com/f/270183/46603/ce1b02c6d5/blog_text-to-speech_php_1200x600.png

PHPによる音声合成音声通話

最終更新日 November 12, 2020

所要時間:4 分

何年もの間、コード内で電話をかけたり受けたりするのは大変なことだった(そしてたいていの場合、Javaを書いたり、古い電話をゲートウェイとしてラップトップにつないだりする必要があった!)。幸いなことに、現在では以下のようなサービスのおかげで、それほど難しいことではなくなった。 Vonage(旧Nexmo).

Voiceコールは、EメールやSMSよりも即時性が高く、優れたコミュニケーション手段です。緊急に誰かにメッセージを伝える必要がある場合は、電話をかけるのが一番です。鳴り響く電話を無視するのは難しいでしょう。

この投稿では、私たちの PHPクライアント.

この記事の完全なコードは、私たちの PHPビルディング・ブロックリポジトリにあります。

前提条件

この記事を読む前にPHPがインストールされている必要があります。私はPHP 7.4を使っていますが、このコードはPHP 5.6以上で動作するはずです。また Composerが必要です。

次に必要なのは NPMをインストールする必要がある。 Nexmo CLI.

Vonageが通信できるように、開発中のアプリを公開する方法が必要です。これは ngrok.このツールに馴染みがない場合は、以下のサイトを参照してほしい。 素晴らしいngrokの紹介がVonageブログで公開されている。とりあえずターミナルを開いて ngrok http 8000.あなたの ngrokURLをメモしておいてください。 https://example.comに置き換える必要があります。

最後に、まだ Vonage Voiceアプリケーションを用意していない場合は、アプリケーションを作成し、番号を購入してリンクする必要があります。最も簡単な方法は Nexmo CLIツール.簡単に説明します:

  • Vonage CLI ツールをインストールするには、次のコマンドを実行します。 npm install -g vonage-cli

  • を実行して、Vonage CLI で認証します。 vonage config:set --apiKey=<api_key> --apiSecret=<api_secret>.置き換え api_keyapi_secretダッシュボード

  • アプリケーションを作成し voice-answer-urlvoice-event-urlをエンドポイントに置き換えて vonage apps:create "Test Application 1" --vbc --voice_answer_url=http://example.com/webhooks/answer.アプリケーションIDをメモしておいてください。

  • 購入可能な番号を検索する vonage numbers:search US

  • を実行して、検索で返された Numbers のいずれかを購入する。 vonage numbers:buy <number>.購入した Numbers をメモしておく。

  • 最後に、以下を実行して番号をアプリケーションにリンクする。 vonage apps:link <application_id> --number=<number>

ワークスペースを作る

ワークスペースをセットアップして、アプリケーションの開発を始めましょう。このチュートリアルでは Slim フレームワークを使用して、Vonage からの通話イベントを受信し、通話をどのように処理するかの指示を返します。composer を使用して以下のコマンドを実行し、Slim でプロジェクトをブートストラップします:

mkdir vonage-calls cd vonage-calls composer require slim/slim "^4.0"

これらのコマンドは vonage-callsという名前のフォルダを作成し、新しく作成したディレクトリに変更し Slimを新しいプロジェクトにインストールします。アプリケーション作成時に保存した private.keyをこのフォルダにコピーします。このフォルダは composer.json.

次に、ローカルのPHPサーバーを起動して、アプリにHTTPコールができるようにする必要がある。これを行うには、新しいターミナルを開いて php -t public -S localhost:8000.先ほど実行した ngrokコマンドのおかげでインターネット経由で利用できるようになりました。

この時点で、Slim アプリケーションが起動し、リッスンし、インターネットに公開されています。このセットアップを行うだけで、Vonage に電話の処理方法を指示する応答が送信されるようになります。

NCCOの作成

Vonageの通話はNexmo Call Control Objects (またはNCCO)を使って制御されます。NCCOは、通話が処理される際にVonageシステムが実行するアクションのリストを定義します。次のようなさまざまなアクションがあります:

まず最初に、シンプルなNCCOを作成する:

[
  {
    "action": "talk",
    "voiceName": "Amy",
    "text": "The amount of visible light from a lamp is measured in lumens"
  }
]

という名前のファイルを作成する。 index.phpという名前のファイルを作成します。以下のコード例では、Slim アプリをブートストラップし、ハンドラーを定義して、次のように指示します。 Slimへのリクエストを受け取るたびにこのハンドラーを使用するよう指示します。 GETリクエストを受け取るたびにこのハンドラーを使用するよう指示します。 /webhook/answer:

<?php

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use Slim\Factory\AppFactory;
require __DIR__ . '/vendor/autoload.php';

$app = AppFactory::create();

$app->get('/webhook/answer', function (Request $request, Response $response) {
    $ncco = [
        [
            'action' => 'talk',
            'voiceName' => 'Amy',
            'text' => 'The amount of visible light from a lamp is measured in lumens'
        ]
    ];

    $response->getBody()->write(json_encode($ncco));

    return $response
            ->withHeader('Content-Type', 'application/json');
});

$app->run();

Vonageが GETにリクエストを送るので answer_urlにリクエストを送ると、これらのリクエストにマッチするハンドラ ($router->get('/webhook/answer')) をマッチさせ、JSON レスポンス (return response()->json()).

正しいフォーマットでJSONを返す限り、Vonageはコールを処理する方法を知っています。これだけです!変更を保存し、音声合成メッセージを聞くために購入した番号に電話してください。

アウトバウンドコールをかける

あなたは素晴らしいスタートを切りましたが、私たちは着信に対応するだけでなく、アウトバウンドコールをすることを目指していました。幸いなことに、あなたはすでにほとんどの作業を終えています。アウトバウンドコールをかけるとき、Vonageはまだあなたの answer_urlに電話をかけます。

アウトバウンドコールをトリガーするには POSTを含むVonage APIへのリクエストを行う必要があります。 to, fromanswer_urlを含むリクエストと認証情報を送信する必要があります。

手作業で呼び出すこともできますが Nexmo PHPクライアントを使えば非常に簡単だ。では、Composerを使ってインストールしてみよう。composer.jsonと同じディレクトリで以下のコマンドを実行してください:

composer require nexmo/client

Nexmoクライアントをインストールしたら、新しい発信コールをトリガーするために呼び出す新しいエンドポイントを追加することができます。APIコールを認証するために、アプリケーションIDと以前に保存した秘密鍵が必要です。そして、Vonage Voice APIに電話をかける必要があります。 private.keycomposer.jsonと同じフォルダにコピーし APPLICATION_IDYOUR_VONAGE_NUMBERをあなたの値に置き換えてください。(自分の ngrokの代わりに example.comも忘れずに!)

$app->get('/makeCall/{number}', function (Request $request, Response $response, array $args) {
    $keypair = new \Nexmo\Client\Credentials\Keypair(
        file_get_contents(__DIR__ . '/private.key'),
        'APPLICATION_ID'
    );

    $client = new \Nexmo\Client($keypair);

    $client->calls()->create([
        'to' => [[
            'type' => 'phone',
            'number' => $args['number']
        ]],
        'from' => [
            'type' => 'phone',
            'number' => 'YOUR_VONAGE_NUMBER'
        ],
        'answer_url' => ['https://afb8ad306a73.ngrok.io/webhook/answer']
    ]);

    return $response
        ->withHeader('Content-Type', 'application/json')
        ->withStatus(200);
});

それが済んだら GETにリクエストする。 /makeCall/にリクエストを出すと、Nexmo経由でテキスト音声通話が発信されます。

ダイナミックNCCO

やろうとしたことは達成したが、少し退屈だ。電話をかけるたびに同じメッセージを放送している。ダイナミックにするには、現在の時刻を読み上げることもできるが、もう少し面白いアイデアがある。発信するたびに チャック・ノリス・データベースにリクエストを出し、その応答を読み上げます。

これを行うには、以下のような軽量HTTPライブラリを使用する。 ガズル.Guzzleを使うには、Composerを使ってインストールする必要がある。と同じディレクトリで以下を実行する。 composer.json:

composer require guzzlehttp/guzzle

Guzzleをインストールしたら、Chuck Norris Databaseにリクエストし、そのレスポンスを使ってNCCOに入力します。デフォルトでは、検索対象をオタク系ジョークに限定します。以下を /answerハンドラの先頭に以下を追加する:

$client = new GuzzleHttp\Client();
$apiResponse = json_decode($client->get('http://api.icndb.com/jokes/random?limitTo=[nerdy]')->getBody());

これは、オタクのカテゴリーからランダムなジョークを返す。次のステップは、NCCOを更新して $apiResponse:

$ncco = [
    [
        'action' => 'talk',
        'voiceName' => 'Amy',
        'text' => $apiResponse->value->joke
    ]
];

これで、Vonageがいつでもあなたの answer_urlにリクエストを送ると、チャック・ノリスのデータベースからランダムなジョークを取得し、それを音声合成の応答として使用する。Vonage番号に電話をかけるか、エンドポイントを経由してアウトバウンドコールをトリガーすることでテストできる。 makeCallエンドポイントを使って発信することができる。

おめでとうございます!あなたは、インバウンドコールとアウトバウンドコールの両方に対応できる音声合成音声通話システムを構築しました。今後は、電話をかけてきた相手や時間帯など、思いつくものに応じて応答をカスタマイズすることができます。

次はどうする?

では、次はどうするのか?アプリケーションを次のように拡張することができます。 音声ベースの重要警報システム連絡先のリストをループして呼び出しをブロードキャストし、受信者が番号を押してメッセージの受信を確認できるようにします。

シェア:

https://a.storyblok.com/f/270183/384x384/1c8825919c/mheap.png
Michael Heapヴォネージの卒業生

マイケルはポリグロット・ソフトウェア・エンジニアであり、システムの複雑性を軽減し、より予測可能なものにすることに尽力している。さまざまな言語やツールを使いこなし、ユーザーグループやカンファレンスで世界中の聴衆と技術的な専門知識を共有している。日々、マイケルはVonageの元開発者支持者であり、あらゆるテクノロジーについて学び、教え、書くことに時間を費やしている。