https://d226lax1qjow5r.cloudfront.net/blog/blogposts/play-an-audio-file-into-a-voice-call-with-java-and-spark-dr/audio-file-java.png

JavaとSparkで音声ファイルを音声通話に再生する

最終更新日 April 30, 2021

所要時間: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を使用して、公衆インターネット上でウェブフックを利用できるようにします。

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Nexmo番号の購入

着信を受けるにはNexmoのバーチャル番号が必要です。開発者ダッシュボードで直接購入できますが、このチュートリアルでは Nexmo CLIツールを使用します。

Nexmo CLIをインストールします:

npm install -g nexmo-cli

そして、あなたの NEXMO_API_KEYそして NEXMO_API_SECRETを設定します:

nexmo setup NEXMO_API_KEY NEXMO_API_SECRET

Nexmo CLIを使用して、その国で購入可能なNumbersを表示します。 voice機能を持つ番号を表示します。 GBを自分の 2文字の国コード:

nexmo number:search GB --voice --verbose

番号を選んで購入する:

nexmo number:buy NEXMO_NUMBER

アプリケーションをインターネット経由でアクセス可能にする

WebhookをNexmoのAPIにアクセスできるようにする必要があります。開発中にこれを行う素晴らしい方法は ngrok.詳しくは ブログポスト.

をダウンロードしてインストールする。 ngrokをダウンロードし、以下のコマンドを実行して、ポート3000のアプリケーションを公衆インターネットに公開する:

ngrok http 3000

が提供する公開URLをメモしておいてください。 ngrokこのチュートリアルの期間中、実行したままにしておいてください。 ngrokにサインアップしない限り、実行するたびに新しいランダムなURLが提供されるからです)。 有料プラン):

Terminal showing the ngrok URLsTerminal showing the ngrok URLs

プロジェクトの作成

というプロジェクト用のディレクトリを作成する。 play-audio-into-callというプロジェクト用のディレクトリを作成し、そのディレクトリに移動して gradleを使ってプロジェクトを初期化する:

mkdir play-audio-into-call cd play-audio-into-call gradle init --type=java-application

すべてのデフォルトを受け入れ、生成されたプロジェクトを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ドメイン名に置き換えて、プロジェクトのルート・ディレクトリで実行してください:

nexmo app:create “Play Audio Example” https://41acbcd0.ngrok.io/webhooks/answer https://example.com/webhooks/events --keyfile private.key

このコマンドは、認証情報を含む private.keyというファイルをダウンロードする。このIDは後のステップで必要になるので、メモしておくこと。

Nexmo番号のリンク

Nexmoバーチャル番号をVoice APIアプリケーションにリンクする必要があります。以下のNexmo CLIコマンドを実行します。 NEXMO_NUMBERをNexmoバーチャル番号(国際ダイヤルコードを含むが、先頭の0は省略)に、そして APPLICATION_IDを前のステップで生成したアプリケーション ID に置き換えます:

nexmo link:app NEXMO_NUMBER APPLICATION_ID

これで設定はすべて終わった。アプリケーションのコーディングに戻ろう。

インバウンドコールに応答する

Nexmoは、あなたのバーチャル番号に着信があった場合、あなたのバーチャル番号に着信リクエストを送信します。 GETリクエストを /webhooks/answerエンドポイントにリクエストを送信します。このエンドポイントはまだ存在しませんが、まもなく作成されます。

Nexmo は、Webhook が以下を含むレスポンスを提供することを期待します。 Nexmoコールコントロールオブジェクト(NCCO).これはJSON形式のオブジェクトの配列で、各オブジェクトはNexmoに呼び出しをどのように処理するかを伝える actionを記述しています。

この例では、音声合成を使って発信者にウェルカムメッセージを読み上げ、会議 に参加させる。これを実現する2つのNCCOアクションは talkconversationである。したがって、応答に含める必要がある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();
});

このコードでは TalkActionConversationActionNexmoクライアント・ライブラリのヘルパー・クラスを使って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アプリケーションを実行する:

gradle run

バーチャル番号に電話をかけ、ウェルカムメッセージを聞き、コンソールに表示されたコールUUIDをメモする。

ブラウザーで、あるいはPostmanや同様のツールを使って、以下のリクエストを作成する。 GETリクエストを作成する。 /playエンドポイントへのリクエストを作成します:

http://localhost:3000/play/d2af966a2fa415b7080b2762940a828c

5秒後に終了する音声が聞こえるはずです。

結論

このチュートリアルでは、Sparkフレームワークを使用してJavaアプリケーションを作成し、Voice APIを使用してNexmoバーチャル番号にかかってきた電話に応答し、カンファレンスを作成し、音声をストリーミングする方法を学びました。友人を招待して、あなたと同時にその番号に電話をかけてもらい、2人で会議に参加できるようにします。音声ファイルを変えてみたり、別の /stop/:idエンドポイントを作成し、音声の再生時間を手動でコントロールできるようにしましょう。

さらに読む

シェア:

https://a.storyblok.com/f/270183/384x384/637d0e41eb/marklewin.png
Mark Lewinヴォネージの卒業生

元Vonageのテクニカルライター。APIをいじり、文書化するのが大好き。