https://d226lax1qjow5r.cloudfront.net/blog/blogposts/build-a-voicemail-with-ruby-on-rails-dr/ruby-voicemail.png

Ruby on Railsでボイスメールを作る

最終更新日 May 13, 2021

所要時間:7 分

お客様に電話番号を提供し、メッセージを残してもらいたいと思ったことはありませんか?Nexmo Voice APIとRuby on Railsを使えば、あなただけのボイスメールアプリケーションを作ることができます。このチュートリアルでは、立ち上げて実行するまでの手順を説明します。あなたのアプリケーションは、電話を受信し、ボイスメールメッセージを録音し、すべてのメッセージを表示して再生するためのウェブインターフェースを持つことができます。

ご希望であれば、このアプリケーションの完全な作業コピーを GutHub

始めよう!

前提条件

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.

このチュートリアルを進めるには、以下のものが必要です:

  • Rails 5.2+

  • ングロク

ボイスメールアプリケーションの作成

これから以下のステップを踏む:

  1. 新しいRailsアプリケーションを作成する

  2. Nexmoアカウントの設定

  3. ngrokのセットアップ

  4. Railsアプリのセットアップ

上記のステップをすべて終えると、新しいアプリケーションに電話をかけ、メッセージを残し、それをウェブ・インターフェイスから再生する準備が整います。

新しいRailsアプリケーションを作成する

コマンドラインから以下を実行する:

rails new nexmo-rails-voicemail-demo --database=postgresql

これが完了すると、データベースとしてPostgreSQLが定義された nexmo-rails-voicemail-demoというまったく新しいRailsアプリケーションができ、データベースとしてPostgreSQLが定義されています。この時点で、PostgreSQLに開発用データベースを作成する必要があります。それには以下を実行します:

createdb nexmo-rails-voicemail-demo_development

データベースが作成されたので、各ボイスメール録音の情報を格納するテーブルを作成します。の一意な識別子を保持するテーブルを作成します。 Conversationの一意の識別子、録音、送信者の電話番号を保持するテーブルが必要です。を定義します。 Conversationの定義と使い方は、 コントローラの作成について説明するときに説明します。以下のコマンドでテーブルを作成します:

rails generate migration CreateRecordings conversation_uuid:string recording_uuid:string from:numeric

ジェネレーターが作成したマイグレーションファイルを検査するには、お好みのコードエディターでアプリケーションを開き、そのファイルを /db/migrateフォルダにあるファイルを表示します。ファイル名は create_recordings.rbという名前の前に、上記のコマンドを実行したときのタイムスタンプが付きます。ファイルは次のようになるはずです:

class CreateRecordings < ActiveRecord::Migration[5.2]
  def change
    create_table :recordings do |t|
      t.string :conversation_uuid
      t.string :recording_uuid
      t.numeric :from

      t.timestamps
    end
  end
end

移行ファイルに問題がなければ、コマンドラインから以下を実行して移行を実行できる。 rake db:migrateコマンドラインから

Railsアプリケーションをセットアップする最後のステップは、依存関係のインストールです。アプリケーションのルートフォルダにある Gemfileを開き、以下を追加します:

# Gemfile

gem 'nexmo_rails'
gem 'dotenv-rails'

ファイルを保存したら、ターミナルから bundle installを実行してください。これで nexmo_railsイニシャライザーgemがインストールされ、認証済みのNexmoクライアントをインスタンス化できるようになります。まずはNexmoのアカウントを作成し、API認証情報を受け取る必要があるので、Nexmoイニシャライザーの実行は保留します。また dotenv-railsgemをインストールしました。これは、Nexmo API認証情報を環境変数として追加する際に役立ちます。

次のステップに進み、Nexmoアカウントを設定する準備ができました。

ngrokのセットアップ

ローカルの開発サーバーを外部からアクセスできるようにする方法はいくつかあるが、最も簡単な方法のひとつがngrokを使う方法だ。以下の記事を読んでほしい。 この記事を参照してほしい。しかし、今回の目的では、ngrokを起動して、ngrokが提供するURLをコピーするだけでいい。

ngrokを起動するには、新しいターミナル・ウィンドウを開き、コマンドラインから以下を実行する:

ngrok http 3000

ターミナル・ウィンドウにngrokロギング・インターフェースが表示されます。インターフェイスの最上部近くには Forwardingで始まる行があり、2つのURLが含まれています。最初のURLは外部からアクセス可能なngrokのURLで、末尾に ngrok.ioが続きます。 http://localhost:3000これはあなたのローカル開発サーバーです。これで、あなたやNexmoが ngrok.ioURLはあなたのローカルサーバーに転送されます。

必ず ngrok.ioURLを安全な場所にコピーしてください。このURLは、次のステップでNexmoアカウント、電話番号、Voiceアプリケーションを設定する際に使用します。

Nexmoアカウントの設定

音声アプリケーションを動作させるためには、Nexmoアカウント、Nexmoプロビジョニングされた電話番号、Nexmoアプリケーション、そして最後にアプリケーションと電話番号をリンクさせる必要があります。

Nexmoのアカウントは無料で作成でき、さらにボーナスとして、あなたのアカウントに2ユーロが入金され、新しいアプリケーションを使い始めることができます。次のサイトをご覧ください。 Vonage API開発者ダッシュボードにアクセスし、Vonage API Developerアカウントをお持ちでない場合はサインアップの手順に従ってください。サインアップが完了すると、Vonage API Developer Dashboardが表示されます。

左側のメニューから Voice menuの項目をクリックします。以下の4つのオプションが表示されます。 APPLICATIONS:

Create voice app

をクリックしてください。 Create an applicationオプションをクリックすると、新しいNexmoアプリケーションを設定するページが表示されます。

以下の項目をフォームに記入してください:

  • Application nameテキストフィールド入力 nexmo-rails-voicemail-demo

  • Event URLテキストフィールドにngrokのURLを入力してください: https://[ngrok url here]/event

  • Answer URLテキスト・フィールドにもう一度ngrokのURLを入力してください: https://[ngrok url here]/webhooks/answer

完了したら、先に進んで青い Create Applicationボタンをクリックしてください。

アプリケーションの作成後、公開鍵と秘密鍵のペアを生成できます。これらのキーは、APIからボイスメールの録音にアクセスする際に必要になります。をクリックし generate public/private key pairをクリックし、自動的にダウンロードされた private.keyファイルをアプリケーションのルートフォルダに移動します。

もしまだそうしていないのなら、アプリケーションのトップレベルに .gitignoreファイルを作成し、そこに ./private.key秘密鍵をバージョン・コントロールにコミットしないようにするためです。

これでNexmo Voiceアプリケーションが作成できました。次のステップは、Nexmoの電話番号を購入し、このアプリケーションにリンクさせることです。

Nexmoダッシュボードから左メニューの Numbersメニュー項目をクリックします。3つのオプションが表示されます:

buy numers

オプションをクリックすると Buy numbersをクリックすると、国、機能、タイプ、4桁の番号を選択するページに移動します。

numbers

現在お住まいの国を選択し、市内通話になるようにします。 Voiceを選び、タイプは携帯電話か固定電話のいずれかを選ぶ。テキストフィールドには何も入力する必要はありません。 Numberテキストフィールドには何も入力する必要はありません。をクリックすると Searchをクリックすると、利用可能な電話番号のリストが表示されます。

オレンジ色の Buyボタンをクリックし、確認画面でもう一度オレンジ色の Buyボタンをクリックする。

一度番号を取得すれば、あとはその番号をあなたの nexmo-rails-voicemail-demoVoiceアプリケーションにリンクさせることができます。電話番号の横にある歯車のアイコンをクリックすると、以下のメニューが表示されます:

webhook dashboard

を選択します。 nexmo-rails-voicemail-demoドロップダウンリストからアプリケーションを選択し、青いボタンをクリックします。 Okボタンをクリックします。これでNexmoの電話番号がVoiceアプリケーションにリンクされ、ボイスプロキシ経由で着信電話を受けたり転送したりできるようになります。

アプリケーションを実行する前の最後のステップは、Railsコントローラ、ビュー、モデル、ルートを定義することです。

Railsアプリのセットアップ

モデル、ビュー、コントローラのコードを書き始める前に、アプリケーションに何をさせたいのかについて少し説明しましょう。アプリケーションには2つの異なる側面があります:

  • 電話を受け、メッセージを録音する

  • ウェブページに録画を表示し、アクセスできるようにする。

最初のタスクである電話の着信とメッセージの録音を達成するためには、電話に応答した際にNexmo Voice APIからのリクエストを受け付け、APIに指示を送り返すことができるWebhookルートが必要です。次に、通話のステータス更新を受け付ける別のルートが必要です。

このアプリケーションの2つ目のタスクは、すべての録画の一覧を表示するリクエストを受け入れるルートが必要です。 GETリクエストが必要です。さらに、すべての録音をリストする必要があるので、それぞれの録音を先ほど作成したデータベースに保存する必要があります。また、リスナーが簡単に再生できるように、それぞれの録音自体も保存したいと思います。

何を目指すのか、コンセプト的に道筋が見えたところで、それを作り始めよう。

ルートを決める

コードエディターで /config/routes.rbファイルをコード・エディターで開き、以下のルートを追加する:

# routes.rb

get '/', to: 'voicemail#index'
get '/answer', to: 'voicemail#answer'
post '/event', to: 'voicemail#event'
post '/recording', to: 'voicemail#new'

アプリケーションへのすべてのトラフィックを、まもなく作成するボイスメールコントローラの適切なメソッドに誘導する4つの個別のルートを作成しました。つのリクエストルートを作成しました。 GET1つはすべての録音をリストアップするトップレベルのリクエストを処理するためのもので、もう1つは電話に応答したときにNexmoから最初のAPIリクエストを受け取るためのものです。また POST1つはNexmoから通話に関するステータスアップデートを受け取るため、もう1つは通話が終わったときに録音を保存するためです。

コントローラーのアクションを定義する

作成したルートは、まだ作成していないコントローラを参照しています。コマンドラインから以下を実行する:

rails generate controller Voicemail

という名前のファイルが /app/controllersと呼ばれる voicemail_controller.rb.それぞれのルートに対してアクションを作成する必要があります。これらのアクションはルートの背後にあるロジックを含み、適切なときに適切なビューにトラフィックを誘導します。アクションは次のとおりです:

  • #index:というインスタンス変数が含まれています。 @recordingsというインスタンス変数が含まれています。

  • #answer:Nexmo Call Control Object (NCCO) [Nexmo APIの指示を含むJSONオブジェクト]をNexmo APIにレンダリングします。

  • #event:Nexmo APIからの更新情報を受信します。アプリケーションが answeredのステータスを受け取ると、このメソッドは Recordingsテーブルに新しいエントリを作成します。

  • #new:録音が行われたときにAPIからアクセスされ、録音エントリーを recording_uuidで録音エントリーを更新します。

最後に、メソッドを定義する前に、2つの定数変数を作成する: NEXMO_NUMBEREXTERNAL_URLそれぞれ、プロビジョニングしたNexmoの電話番号と、外部からアクセス可能なngrokのURLを格納します。これらの変数は、必ずコントローラで定義してください。

これが完成したときのコントローラーの姿だ:

# voicemail_controller.rb

class VoicemailController < ApplicationController
    skip_before_action :verify_authenticity_token

    NEXMO_NUMBER = YOUR PHONE NUMBER GOES HERE
    EXTERNAL_URL = 'YOUR NGROK URL GOES HERE'
    
    def index
        @recordings = Recording.all
    end

    def answer
        render json:
        [
            {
                :action => 'talk',
                :text => 'Leave your message after the beep.'
            },
            {
                :action => 'record',
                :beepStart => true,
                :eventUrl => [ "#{EXTERNAL_URL}/recording" ],
                :endOnSilence => 3
            }
        ]
    end

    def event
        if params['status'] == 'answered'
            Recording.create(conversation_uuid: params['conversation_uuid'], from: params['from'])
        end
    end

    def new
        if params['recording_url']
            recording = Recording.find_by(uuid: params['conversation_uuid'])
            recording.recording_uuid = params['recording_uuid']
            recording.save
            Nexmo.files.save(params['recording_url'], "public/voicemail/#{params['recording_uuid']}.wav")
        end
    end
end

モデルを定義する

このアプリでは、データベースの Recordingsテーブルとやり取りするために使います。という名前のファイルを作成します。 recording.rbというファイルを作成します。 /app/models/を継承したモデルであることを定義するだけです。 ActiveRecord::Base:

# recording.rb

class Recording < ActiveRecord::Base
end

ルート、コントローラ、モデルが定義できたので、次に作成するのは #indexビューです。さっそく作ってみましょう。

ビューを作る

アプリケーションには、すべてのボイスメールの録音が表示されるビューを1つ作成する必要があります。ユーザーはそのうちのどれかをクリックして、録音を再生することができます。そのためには index.html.erbファイルを /app/views/voicemail.そのファイル内で、ボイスメールに作成したインスタンス変数 @recordingsインスタンス変数を利用します。 #indexアクションで作成した Recordingsテーブルのすべてのエントリが含まれています。そのデータを繰り返し処理し、すべての録音を一覧表示するHTMLテーブルを作成します。最終的なビューのコードは次のようになります:

# index.html.erb

<h1>Your Voicemail</h1>

<strong>You have <%= Dir["public/voicemail/*"].length %> messages</strong>

<br /><br />

<table>
    <tr>
        <th>From</th>
        <th>Timestamp</th>
        <th>Conversation UUID</th>
        <th>Recording</th>
    </tr>
    <% @recordings.each do |r| %>
        <tr>
            <td><%= r.from %></td>
            <td><%= r.created_at %></td>
            <td><%= r.conversation_uuid %></td>
            <td><a href="/voicemail/<%= r.recording_uuid %>.wav">Click here to listen</a></td>
        </tr>
    <% end %>
</table>

HTMLテーブルに加えてビューに追加した項目は、ボイスメールの録音件数のカウントです。Rubyの #lengthメソッドを利用して、ボイスメール録音ローカル・フォルダ内のファイル数をカウントし、その数を表示しています。

ビューの作成で、アプリの準備はほぼ整いました。最後に、Nexmo APIの認証情報を環境変数として追加し、Nexmo Railsイニシャライザを使ってNexmoクライアントを初期化します。

Nexmo認証情報の追加とNexmoクライアントの初期化

このチュートリアルの最初の方で dotenv-railsnexmo_railsgemsをインストールしました。前者はアプリケーションで環境変数を管理するのに役立ち、後者にはNexmoクレデンシャルクライアントを初期化するためのRailsジェネレータが含まれています。

Nexmoのクレデンシャルを追加するために最初にしたいことは、プロジェクトのルートフォルダーにあるファイルを開くか、まだ存在しない場合は作成することです、 .envを開きます。その .envファイル内に、Nexmo APIキー、秘密鍵、秘密鍵ファイルのパス、アプリケーションIDの認証情報を追加します。値はNexmoダッシュボードから取得した固有の認証情報に置き換えてください:

# .env

NEXMO_API_KEY=your api key
NEXMO_API_SECRET=your api secret
NEXMO_APPLICATION_ID=your application id
NEXMO_PRIVATE_KEY=./private.key

認証情報が環境変数として追加されたので、ジェネレーターを実行する準備ができました。コマンドラインから以下を実行する:

rails generate nexmo_initializer

以上です!これで完全に機能するアプリケーションができました。

Railsサーバーを起動し、ngrokが起動していることを確認したら、電話をかけてメッセージを残してください!

シェア:

https://a.storyblok.com/f/270183/384x384/e5480d2945/ben-greenberg.png
Ben Greenbergヴォネージの卒業生

ベンはセカンドキャリアの開発者で、以前は成人教育、コミュニティ組織化、非営利団体運営の分野で10年を過ごした。彼はVonageの開発者支援者として働いていた。コミュニティ開発とテクノロジーの交差点について定期的に執筆している。南カリフォルニア出身で、長年ニューヨークに住んでいたが、現在はイスラエルのテルアビブ近郊に在住。