https://a.storyblok.com/f/270183/228774/72e2156c77/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を使用して、公衆インターネット上でウェブフックを利用できるようにします。

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をいじり、文書化するのが大好き。