Twilio语音记录

Twilio语音记录,twilio,call-recording,Twilio,Call Recording,我正在使用TwilioJS客户端从web进行调用。客户端调用后端以获取令牌。这里是返回令牌的后端代码。如何记录通话。表示设置录制url的位置。呼叫成功。但不知道在哪里传递录制url public function newToken(Request $request) { $accountSid = config('services.twilio')['accountSid']; $applicationSid = config('services.twil

我正在使用TwilioJS客户端从web进行调用。客户端调用后端以获取令牌。这里是返回令牌的后端代码。如何记录通话。表示设置录制url的位置。呼叫成功。但不知道在哪里传递录制url

public function newToken(Request $request)
    {
        $accountSid = config('services.twilio')['accountSid'];
        $applicationSid = config('services.twilio')['applicationSid'];
        $apiKey = config('services.twilio')['apiKey'];
        $apiSecret = config('services.twilio')['apiSecret'];

        $voiceGrant = new VoiceGrant();
        $voiceGrant->setOutgoingApplicationSid($applicationSid);

        $voiceGrant->setIncomingAllow(true);

        $this->accessToken->addGrant($voiceGrant);

        $token = $this->accessToken->toJWT();

        return response()->json(['token' => $token]);
    }
在JS端,使用twillio客户端库的代码

const Device = Twilio.Device;

// Store some selectors for elements we'll reuse
var callStatus = $("#call-status");
var answerButton = $(".answer-button");
var callSupportButton = $(".call-support-button");
var hangUpButton = $(".hangup-button");
var callCustomerButtons = $(".call-customer-button");

var device = null;

function updateCallStatus(status) {
    callStatus.attr('placeholder', status);
}

/* Get a Twilio Client token with an AJAX request */
$(document).ready(function() {
    setupClient();
});

function setupHandlers(device) {
    device.on('ready', function(_device) {
        updateCallStatus("Ready");
    });

    /* Report any errors to the call status display */
    device.on('error', function(error) {
        updateCallStatus("ERROR: " + error.message);
    });

    /* Callback for when Twilio Client initiates a new connection */
    device.on('connect', function(connection) {
        // Enable the hang up button and disable the call buttons
        hangUpButton.prop("disabled", false);
        callCustomerButtons.prop("disabled", true);
        callSupportButton.prop("disabled", true);
        answerButton.prop("disabled", true);

        // If phoneNumber is part of the connection, this is a call from a
        // support agent to a customer's phone
        if ("phoneNumber" in connection.message) {
            updateCallStatus("In call with " + connection.message.phoneNumber);
        } else {
            // This is a call from a website user to a support agent
            updateCallStatus("In call with support");
        }
    });

    /* Callback for when a call ends */
    device.on('disconnect', function(connection) {
        // Disable the hangup button and enable the call buttons
        hangUpButton.prop("disabled", true);
        callCustomerButtons.prop("disabled", false);
        callSupportButton.prop("disabled", false);

        updateCallStatus("Ready");
    });

    /* Callback for when Twilio Client receives a new incoming call */
    device.on('incoming', function(connection) {
        updateCallStatus("Incoming support call");

        // Set a callback to be executed when the connection is accepted
        connection.accept(function() {
            updateCallStatus("In call with customer");
        });

        // Set a callback on the answer button and enable it
        answerButton.click(function() {
            connection.accept();
        });
        answerButton.prop("disabled", false);
    });
};

function setupClient() {
    $.post("/token", {
        forPage: window.location.pathname,
        _token: $('meta[name="csrf-token"]').attr('content')
    }).done(function(data) {
        // Set up the Twilio Client device with the token
        device = new Device();
        device.setup(data.token);

        setupHandlers(device);
    }).fail(function() {
        updateCallStatus("Could not get a token from server!");
    });

};

/* Call a customer from a support ticket */
window.callCustomer = function(phoneNumber) {
    updateCallStatus("Calling " + phoneNumber + "...");

    var params = { "phoneNumber": phoneNumber };
    device.connect(params);
};

/* Call the support_agent from the home page */
window.callSupport = function() {
    updateCallStatus("Calling support...");

    // Our backend will assume that no params means a call to support_agent
    device.connect();
};

/* End a call */
window.hangUp = function() {
    device.disconnectAll();
};

我假设您在TwiML应用程序上设置的URL生成的TwiML包含动词,以便将传入的客户端呼叫连接到PSTN号码之类的东西

如果该假设正确,则可以在该动词上包含
record
属性:

<Response>
 <Dial record="record-from-ringing-dual"
   recordingStatusCallback="https://myapp.com/recording-events"
   recordingStatusCallbackEvent="in-progress completed absent">
   <Number>+15558675310</Number>
 </Dial>
</Response>

+15558675310
对于双声道录音,使用接听双声道录音或振铃双声道录音的录音值,以不同的立体声音轨播放家长和孩子的通话


有关更多详细信息,请参阅支持文章。

是的,这就是问题所在。TwiML只是在拨这个号码。我能解决它,但谢谢你的回答。