
JavaとSparkで音声ファイルを音声通話に再生する
所要時間:10 分
このチュートリアルでは、Nexmo Voice APIを使って通話に音声をストリーミングする方法を紹介します。
最もわかりやすい使用例は、保留音楽やメッセージを流すことだ。保留にされることを特に好む人はいません。しかし、電話をかけてきた人に無音ではなく何か聴かせることで、できるだけ快適な体験をさせることができます。研究によると、電話をかけてきた人が何かを聴いていると、時間が経つのが早く感じられ、不安レベルが大幅に下がることが分かっています。
しかし、同じ研究では、強制的に聴かされるものが気に入らないと、発信者が否定的な反応を示すことも報告されている。ですから、音楽やメッセージは慎重に選びましょう。 リック・ロール彼ら
着信に応答するには、一般にアクセス可能な ウェブフックを作成し、Nexmoアカウントを設定する必要があります。Javaと スパーク・ウェブ・フレームワークを使用します。呼び出しが始まったら、Nexmo REST API Client Library for Javaを使います。 Java用Nexmo REST APIクライアント・ライブラリを使って音声をストリーミングします。このチュートリアルのコードのバージョンは GitHub.
前提条件
JDK JDKまたはそれに相当するオープンソースの オープンJDK.このチュートリアルはOpenJDK 11を使って書かれていますが、バージョン8以上であればどちらでも問題ありません。
Gradle(バージョン3.4以降)を使ってプロジェクトをビルドし、依存関係を管理します。
ngrokを使用して、公衆インターネット上でウェブフックを利用できるようにします。
Nexmo番号の購入
着信を受けるにはNexmoのバーチャル番号が必要です。開発者ダッシュボードで直接購入できますが、このチュートリアルでは Nexmo CLIツールを使用します。
Nexmo CLIをインストールします:
そして、あなたの NEXMO_API_KEYそして NEXMO_API_SECRETを設定します:
Nexmo CLIを使用して、その国で購入可能なNumbersを表示します。 voice機能を持つ番号を表示します。 GBを自分の 2文字の国コード:
番号を選んで購入する:
アプリケーションをインターネット経由でアクセス可能にする
WebhookをNexmoのAPIにアクセスできるようにする必要があります。開発中にこれを行う素晴らしい方法は ngrok.詳しくは ブログポスト.
をダウンロードしてインストールする。 ngrokをダウンロードし、以下のコマンドを実行して、ポート3000のアプリケーションを公衆インターネットに公開する:
が提供する公開URLをメモしておいてください。 ngrokこのチュートリアルの期間中、実行したままにしておいてください。 ngrokにサインアップしない限り、実行するたびに新しいランダムなURLが提供されるからです)。 有料プラン):
Terminal showing the ngrok URLs
プロジェクトの作成
というプロジェクト用のディレクトリを作成する。 play-audio-into-callというプロジェクト用のディレクトリを作成し、そのディレクトリに移動して gradleを使ってプロジェクトを初期化する:
すべてのデフォルトを受け入れ、生成されたプロジェクトをIDEで開く。
依存関係の初期化
ファイルを探し build.gradleファイルを見つけ、依存リポジトリを jcenter()から mavenCentral():
repositories {
mavenCentral()
}セクションを dependenciesセクションを以下のように置き換える:
dependencies {
// Spark framework
implementation 'com.sparkjava:spark-core:2.8.0'
// Nexmo client library
implementation 'com.nexmo:client:4.4.0'
// Use JUnit test framework
testImplementation 'junit:junit:4.12'
}この例では JUnitこの例では使用しませんが、今のところはそのままにしておいてください。
Sparkを使ってWebアプリケーションを作成する
Gradleは Appクラスを src/main/java/play/audio/into/callディレクトリに作成されます。
開く App.javaをIDEで開いてください。メソッドを削除します。 getGreeting()メソッドを削除します。 gradleを削除し、必要な importステートメントを追加します。 sparkパッケージに必要なステートメントを追加します。
次に、Sparkの portメソッドを呼び出して、アプリケーションがポート3000でリクエストをリッスンしていることを示します。
あなたの App.javaはこのようになるはずだ:
package play.audio.into.call;
import static spark.Spark.*;
public class App {
public static void main(String[] args) throws Exception {
port(3000);
System.out.println("I'm listening!");
}
}を実行してアプリケーションを実行する。 gradle runを実行してアプリケーションを実行する。 play-audio-into-callディレクトリで実行してください。ブラウザで http://localhost:3000にアクセスし、ページに表示される "I'm listening "メッセージを確認してください。
Voice APIアプリケーションの生成
Voice API ApplicationsはNexmoの構成要素であり、あなたが書こうとしているアプリケーションと混同しないでください。その代わり、APIを使用するために必要な認証とコンフィギュレーション設定のための "コンテナ "です。
Nexmo CLIでVoice API Applicationsを作成することができます。アプリケーションの名前と2つのWebhookエンドポイントのNumbersを指定する必要があります。1つ目はバーチャル番号に着信があったときにNexmoのAPIがリクエストを行うもので、2つ目はAPIがイベントデータをポストできるものです。
このチュートリアルでは "answer "ウェブフックにしか興味がないので、"event "ウェブフックのURLは何でも構いません。次の Nexmo CLI コマンドのドメイン名をあなたの ngrokドメイン名に置き換えて、プロジェクトのルート・ディレクトリで実行してください:
このコマンドは、認証情報を含む private.keyというファイルをダウンロードする。このIDは後のステップで必要になるので、メモしておくこと。
Nexmo番号のリンク
Nexmoバーチャル番号をVoice APIアプリケーションにリンクする必要があります。以下のNexmo CLIコマンドを実行します。 NEXMO_NUMBERをNexmoバーチャル番号(国際ダイヤルコードを含むが、先頭の0は省略)に、そして APPLICATION_IDを前のステップで生成したアプリケーション ID に置き換えます:
これで設定はすべて終わった。アプリケーションのコーディングに戻ろう。
インバウンドコールに応答する
Nexmoは、あなたのバーチャル番号に着信があった場合、あなたのバーチャル番号に着信リクエストを送信します。 GETリクエストを /webhooks/answerエンドポイントにリクエストを送信します。このエンドポイントはまだ存在しませんが、まもなく作成されます。
Nexmo は、Webhook が以下を含むレスポンスを提供することを期待します。 Nexmoコールコントロールオブジェクト(NCCO).これはJSON形式のオブジェクトの配列で、各オブジェクトはNexmoに呼び出しをどのように処理するかを伝える actionを記述しています。
この例では、音声合成を使って発信者にウェルカムメッセージを読み上げ、会議 に参加させる。これを実現する2つのNCCOアクションは talkと conversationである。したがって、応答に含める必要があるNCCOは次のようになります:
[
{
"action": "talk",
"voiceName": "Russell",
"text": "Please wait while we connect you to the conference"
},
{
"action": "conversation",
"name": "Test Conference"
}
]その talk アクションはかなり自明なはずだ。あなたがしていることは text文字列を Russellボイスで文字列を読み返すだけです。(利用可能なVoiceの完全なリストは こちら).
その conversation アクションアクションでは、複数の発信者を同じ会議に参加させるために nameを指定する必要がある。このチュートリアルでは、あなたが唯一の発信者である可能性が高いですが、それでも名前を付ける必要があります。このチュートリアルでは conversationアクションを使用しているのは、後で音声をストリーミングできるように、通話をオープンにしておくためです。
Java用 Java用Nexmo REST APIクライアント・ライブラリには、このNCCOを作成するためのヘルパー・クラスがいくつか用意されているので、まずそれを設定しよう。
Nexmoクライアントのインスタンス化
以下のインポートを App.javaファイルに以下のインポートを含める:
import com.nexmo.client.NexmoClient;次に mainメソッドの中で port(3000)を呼び出す直下で、クライアント・ライブラリをインスタンス化します。 /path/to/your/private.keyのパスを private.keyファイルへのパスと APPLICATION_IDを Voice API Applications ID に置き換えてください:
public class App {
public static void main(String[] args) throws Exception {
port(3000);
NexmoClient client = NexmoClient.builder()
.applicationId("APPLICATION_ID")
.privateKeyPath("/path/to/your/private.key")
.build();
}
} アンサーウェブフックの作成
そこでまず、エンドポイントを作成する必要がある。このために使うルートは /webhooks/answer.
以下を含む importステートメント
import com.nexmo.client.voice.VoiceName;
import com.nexmo.client.voice.ncco.Ncco;
import com.nexmo.client.voice.ncco.TalkAction;
import com.nexmo.client.voice.ncco.ConversationAction;そして、次のコードを mainメソッドに追加します:
get("/webhooks/answer", (req, res) -> {
String callId = req.queryParams("uuid");
System.out.println("Call answered. The UUID for this call is: " + callId);
TalkAction intro = TalkAction.builder("Please wait while we connect you to the conference.")
.voiceName(VoiceName.RUSSELL)
.build();
ConversationAction conversation = ConversationAction.builder("Test conference")
.build();
res.type("application/json");
return new Ncco(intro, conversation).toJson();
});
このコードでは TalkActionと ConversationActionNexmoクライアント・ライブラリのヘルパー・クラスを使ってNCCOを構築し、Nexmoへのレスポンスとして返す。
まず ngrokを実行し gradle run.次に、Nexmoのバーチャル番号に電話をかけます。アプリケーションに通話UUIDが表示され、ウェルカムメッセージが聞こえます。回線は切断するまで開いたままです。
音声を通話に流す
次に、電話会議にオーディオを再生する方法が必要です。そのためには、次のようなルートを作成します。 /play/:idというルートを作成する。 :idは、音声をストリーミングしたい通話のUUIDである。電話会議が始まったら、このルートを手動で呼び出す。
以下を追加する。 importステートメントを追加する:
import com.nexmo.client.voice.StreamResponse;ルートは /play/:idルートを mainメソッドでルートを作成します:
get("/play/:id", (req, res) -> {
String id = req.params(":id");
final String URL = "http://example.com/your/audio/file.mp3";
System.out.println("Playing audio into " + id.toString());
StreamResponse startStreamResponse = client.getVoiceClient().startStream(id, URL, 0);
System.out.println(startStreamResponse.getMessage());
Thread.sleep(5000);
client.getVoiceClient().stopStream(id);
return "";
});
置き換える URLをお好きなオーディオファイルのURLに置き換えてください。テスト用に https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3を使ってテストできます。
このルートはリクエストURLからコールUUIDを取り除き GETリクエストURLからコールUUIDを取り除き startStreamメソッドで使用します。このルートは5秒間オーディオを再生し、その後 stopStream.を呼び出すことで再生を停止する。 startStreamこれはNexmoに音声を何回再生するかを指示するもので、0は無限を意味する。
試してみる
これで準備は整った!これでテストできます。
アプリケーション・ディレクトリ内からJavaアプリケーションを実行する:
バーチャル番号に電話をかけ、ウェルカムメッセージを聞き、コンソールに表示されたコールUUIDをメモする。
ブラウザーで、あるいはPostmanや同様のツールを使って、以下のリクエストを作成する。 GETリクエストを作成する。 /playエンドポイントへのリクエストを作成します:
http://localhost:3000/play/d2af966a2fa415b7080b2762940a828c
5秒後に終了する音声が聞こえるはずです。
結論
このチュートリアルでは、Sparkフレームワークを使用してJavaアプリケーションを作成し、Voice APIを使用してNexmoバーチャル番号にかかってきた電話に応答し、カンファレンスを作成し、音声をストリーミングする方法を学びました。友人を招待して、あなたと同時にその番号に電話をかけてもらい、2人で会議に参加できるようにします。音声ファイルを変えてみたり、別の /stop/:idエンドポイントを作成し、音声の再生時間を手動でコントロールできるようにしましょう。