Aufzeichnung eines Gesprächs mit geteiltem Ton

Ein Codeschnipsel, der zeigt, wie man einen eingehenden Anruf entgegennimmt und ihn so einrichtet, dass die Gesprächsabschnitte getrennt aufzeichnet und dann den Anruf verbindet. Wenn der Anruf beendet ist, wird der eventUrl die Sie in der Datei record Aktion des NCCO erhalten einen Webhook mit der URL der Aufzeichnung zum Download.

Beispiel

Ersetzen Sie die folgenden Variablen im Beispielcode:

SchlüsselBeschreibung
VONAGE_VIRTUAL_NUMBER

Your Vonage Number. E.g. 447700900000

VOICE_TO_NUMBER

The recipient number to call, e.g. 447700900002.

Voraussetzungen

npm install express body-parser

Schreiben Sie den Code

Fügen Sie Folgendes zu record-a-call-with-split-audio.js hinzu:

const Express = require('express');
const bodyParser = require('body-parser');

const app = new Express();
app.use(bodyParser.json());

const onInboundCall = (request, response) => {
  const ncco = [
    {
      action: 'record',
      split: 'conversation',
      channels: 2,
      eventUrl: [`${request.protocol}://${request.get('host')}/webhooks/recordings`],
    },
    {
      action: 'connect',
      from: VONAGE_VIRTUAL_NUMBER,
      endpoint: [
        {
          type: 'phone',
          number: VOICE_TO_NUMBER,
        },
      ],
    },
  ];
  response.json(ncco);
};

const onRecording = (request, response) => {
  const recording_url = request.body.recording_url;
  console.log(`Recording URL = ${recording_url}`);

  response.status(204).send();
};

app
  .get('/webhooks/answer', onInboundCall)
  .post('/webhooks/recordings', onRecording);

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

Vollständige Quelle anzeigen

Führen Sie Ihren Code aus

Speichern Sie diese Datei auf Ihrem Rechner und führen Sie sie aus:

node record-a-call-with-split-audio.js

Voraussetzungen

Fügen Sie Folgendes zu build.gradle hinzu:

implementation 'com.vonage:server-sdk-kotlin:2.1.1'
implementation 'io.ktor:ktor-server-netty'
implementation 'io.ktor:ktor-serialization-jackson'

Schreiben Sie den Code

Fügen Sie der Methode main in der Datei RecordCallSplitAudio Folgendes hinzu:

embeddedServer(Netty, port = 8000) {
    routing {
        get("/webhooks/answer") {
            call.response.header("Content-Type", "application/json")
            call.respond(
                Ncco(
                    recordAction {
                        eventUrl(call.request.path().replace("answer", "recordings"))
                        channels(2)
                    },
                    connectToPstn(VOICE_TO_NUMBER) {
                        from(VONAGE_VIRTUAL_NUMBER)
                    }
                ).toJson()
            )
        }
        post("/webhooks/recordings") {
            val event = EventWebhook.fromJson(call.receive())
            println("Recording URL: ${event.recordingUrl}")
            call.respond(204)
        }
    }
}.start(wait = true)

Vollständige Quelle anzeigen

Führen Sie Ihren Code aus

Wir können das Anmeldung Plugin für Gradle verwenden, um die Ausführung unserer Anwendung zu vereinfachen. Aktualisieren Sie Ihre build.gradle mit dem Folgenden:

apply plugin: 'application'
mainClassName = project.hasProperty('main') ? project.getProperty('main') : ''

Führen Sie den folgenden Befehl gradle aus, um Ihre Anwendung auszuführen, und ersetzen Sie dabei com.vonage.quickstart.kt.voice durch das Paket, das RecordCallSplitAudio enthält:

gradle run -Pmain=com.vonage.quickstart.kt.voice.RecordCallSplitAudio

Voraussetzungen

Fügen Sie Folgendes zu build.gradle hinzu:

implementation 'com.vonage:server-sdk:9.3.1'
implementation 'com.sparkjava:spark-core:2.9.4'

Schreiben Sie den Code

Fügen Sie der Methode main in der Datei RecordCallSplitAudio Folgendes hinzu:

/*
 * Route to answer and connect incoming calls with recording.
 */
Route answerRoute = (req, res) -> {
    String recordingUrl = String.format("%s://%s/webhooks/recordings", req.scheme(), req.host());

    RecordAction record = RecordAction.builder()
            .eventUrl(recordingUrl)
            .channels(2)
            .build();

    ConnectAction connect = ConnectAction.builder(PhoneEndpoint.builder(VOICE_TO_NUMBER).build())
            .from(VONAGE_VIRTUAL_NUMBER).build();

    res.type("application/json");

    return new Ncco(record, connect);
};

/*
 * Route which prints out the recording URL it is given to stdout.
 */
Route recordingRoute = (req, res) -> {
    System.out.println(EventWebhook.fromJson(req.body()).getRecordingUrl());

    res.status(204);
    return "";
};

Spark.port(3000);
Spark.get("/webhooks/answer", answerRoute);
Spark.post("/webhooks/recordings", recordingRoute);

Vollständige Quelle anzeigen

Führen Sie Ihren Code aus

Wir können das Anmeldung Plugin für Gradle verwenden, um die Ausführung unserer Anwendung zu vereinfachen. Aktualisieren Sie Ihre build.gradle mit dem Folgenden:

apply plugin: 'application'
mainClassName = project.hasProperty('main') ? project.getProperty('main') : ''

Führen Sie den folgenden Befehl gradle aus, um Ihre Anwendung auszuführen, und ersetzen Sie dabei com.vonage.quickstart.voice durch das Paket, das RecordCallSplitAudio enthält:

gradle run -Pmain=com.vonage.quickstart.voice.RecordCallSplitAudio

Voraussetzungen

Install-Package Vonage

Schreiben Sie den Code

Fügen Sie Folgendes zu SplitAudioController.cs hinzu:

[HttpGet("webhooks/answer")]
public IActionResult Answer()
{
    var VOICE_TO_NUMBER = Environment.GetEnvironmentVariable("VOICE_TO_NUMBER") ?? "VOICE_TO_NUMBER";
    var VONAGE_VIRTUAL_NUMBER = Environment.GetEnvironmentVariable("VONAGE_VIRTUAL_NUMBER") ?? "VONAGE_VIRTUAL_NUMBER";
    var host = Request.Host.ToString();
    //Uncomment the next line if using ngrok with --host-header option
    //host = Request.Headers["X-Original-Host"];

    var eventUrl = $"{Request.Scheme}://{host}/SplitAudio/webhooks/recording";
    var talkAction = new TalkAction {Text = "recording call", BargeIn = false};
    var recordAction = new RecordAction
    {
        EventUrl = new[] {eventUrl},
        EventMethod = "POST",
        Channels = 2,
        Split = "conversation"
    };

    var connectAction = new ConnectAction()
    {
        From = VONAGE_VIRTUAL_NUMBER,
        Endpoint = new[] {new PhoneEndpoint {Number = VOICE_TO_NUMBER}},
    };

    var ncco = new Ncco(talkAction, recordAction, connectAction);
    return Ok(ncco.ToString());
}

[HttpPost("webhooks/recording")]
public async Task<IActionResult> Recording()
{
    var record = await WebhookParser.ParseWebhookAsync<Record>(Request.Body, Request.ContentType);
    Console.WriteLine($"Record event received on webhook - URL: {record?.RecordingUrl}");
    return StatusCode(204);
}

Vollständige Quelle anzeigen

Voraussetzungen

composer require slim/slim:^3.8 vonage/client

Schreiben Sie den Code

Fügen Sie Folgendes zu index.php hinzu:

require 'vendor/autoload.php';

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

define('TO_NUMBER', getenv('TO_NUMBER'));
define('VONAGE_NUMBER', getenv('VONAGE_NUMBER'));

$app = new \Slim\App();

$app->get('/webhooks/answer', function (Request $request, Response $response) {
    //Get our public URL for this route
    $uri = $request->getUri();
    $url = $uri->getScheme() . '://'.$uri->getHost() . ($uri->getPort() ? ':'.$uri->getPort() : '') . '/webhooks/recording';

    $record = new \Vonage\Voice\NCCO\Action\Record();
    $record->setEventWebhook(new \Vonage\Voice\Webhook($url));
    $record->setChannels(2);

    $connect = new \Vonage\Voice\NCCO\Action\Connect(new \Vonage\Voice\Endpoint\Phone(TO_NUMBER));
    $connect->setFrom(VONAGE_NUMBER);

    $ncco = new \Vonage\Voice\NCCO\NCCO();
    $ncco->addAction($connect);
    $ncco->addAction($record);

    return new JsonResponse($ncco);
});

$app->post('/webhooks/recording', function (Request $request, Response $response) {
    /** @var \Vonage\Voice\Webhook\Record */
    $recording = \Vonage\Voice\Webhook\Factory::createFromRequest($request);
    error_log($recording->getRecordingUrl());

    return $response->withStatus(204);
});

$app->run();

Vollständige Quelle anzeigen

Führen Sie Ihren Code aus

Speichern Sie diese Datei auf Ihrem Rechner und führen Sie sie aus:

php index.php

Voraussetzungen

pip install vonage python-dotenv fastapi[standard]

Schreiben Sie den Code

Fügen Sie Folgendes zu record-a-call-with-split-audio.py hinzu:

import os
from os.path import dirname, join
from pprint import pprint

from dotenv import load_dotenv
from fastapi import Body, FastAPI
from vonage_voice import Connect, NccoAction, PhoneEndpoint, Record

dotenv_path = join(dirname(__file__), '../.env')
load_dotenv(dotenv_path)

VONAGE_VIRTUAL_NUMBER = os.environ.get('VONAGE_VIRTUAL_NUMBER')
VOICE_TO_NUMBER = os.environ.get('VOICE_TO_NUMBER')

app = FastAPI()


@app.get('/webhooks/answer')
async def inbound_call():
    ncco: list[NccoAction] = [
        Record(
            split='conversation',
            channels=2,
            eventUrl=['https://demo.ngrok.io/webhooks/recordings'],
        ),
        Connect(
            from_=VONAGE_VIRTUAL_NUMBER, endpoint=[PhoneEndpoint(number=VOICE_TO_NUMBER)]
        ),
    ]

    return [step.model_dump(by_alias=True, exclude_none=True) for step in ncco]


@app.post('/webhooks/recordings')
async def recordings(data: dict = Body(...)):
    pprint(data)
    return {'message': 'webhook received'}

Vollständige Quelle anzeigen

Führen Sie Ihren Code aus

Speichern Sie diese Datei auf Ihrem Rechner und führen Sie sie aus:

fastapi dev voice/record-a-call-with-split-audio.py

Voraussetzungen

gem install sinatra sinatra-contrib

Schreiben Sie den Code

Fügen Sie Folgendes zu record-a-call-with-split-audio.rb hinzu:

require 'dotenv/load'
require 'sinatra'
require 'sinatra/multi_route'
require 'json'

VOICE_TO_NUMBER = ENV['VOICE_TO_NUMBER']
VONAGE_VIRTUAL_NUMBER = ENV['VONAGE_VIRTUAL_NUMBER']

before do
  content_type :json
end

helpers do
  def parsed_body
    JSON.parse(request.body.read)
  end
end

route :get, :post, '/webhooks/answer' do
  [
    {
      "action": "record",
      "split": "conversation",
      "channels": 2,
      "eventUrl": ["#{request.base_url}/webhooks/recordings"]
    },
    {
      "action": "connect",
      "from": VONAGE_VIRTUAL_NUMBER,
      "endpoint": [
        {
          "type": "phone",
          "number": VOICE_TO_NUMBER
        }
      ]
    }
  ].to_json
end

route :get, :post, '/webhooks/recordings' do
  recording_url = params['recording_url'] || parsed_body['recording_url']
  puts "Recording URL = #{recording_url}"

  halt 204
end

set :port, 3000

Vollständige Quelle anzeigen

Führen Sie Ihren Code aus

Speichern Sie diese Datei auf Ihrem Rechner und führen Sie sie aus:

ruby record-a-call-with-split-audio.rb

Probieren Sie es aus

Das müssen Sie tun:

  1. Nehmen Sie den Anruf entgegen und zeichnen Sie ihn mit geteiltem Ton auf (dieses Codeschnipsel).
  2. Laden Sie die Aufzeichnung herunter. Siehe die Eine Aufnahme herunterladen Codeschnipsel, wie das geht.