Twilio транскрибировать голос в ASP.NET MVC - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь расшифровать голосовой ответ вызывающего абонента и программно зачитать голосовой ответ пользователя с помощью twilio.

Итак, когда пользователь первоначально вызывает номер twilio, вызов привязывается к методу ниже действия (см. Вhttps://www.twilio.com/docs/voice/twiml/record?code-sample=code-record-a-voicemail&code-language=C%23&code-sdk-version=5.x) приложения ASP.NET MVC.

[HttpPost]
public TwiMLResult Welcome()
{
    var response = new VoiceResponse();
    try
    {
        response.Say("Please say your user Id, example ABC123, \n and press star when done", Say.VoiceEnum.Alice, null, Say.LanguageEnum.EnGb);
        // record and transcribe users voice        
        response.Record(
        transcribe: true,
        transcribeCallback: new Uri("https://35eb31e3.ngrok.io/Ivr/HandleTranscribedVrn"),
        finishOnKey: "*");
        response.Say("I did not receive a recording");
    }
    catch (Exception e)
    {
        ErrorLog.LogError(e, "Error within ivr/Welcome");
        response = RejectCall();
    }

    return TwiML(response);
}  

Примечание - https://35eb31e3.ngrok.io/Ivr/HandleTranscribedVrn - это туннельный общедоступный URL-адрес ngRok для вызова метода.

ИтакЯ пытаюсь записать голосовой ввод пользователя после того, как пользователь произнес его / ее идентификатор пользователя и затем нажимает клавишу *. Поэтому после нажатия * я ожидаю, что twilio расшифрует и ответит на метод действия обратного вызова ниже (https://35eb31e3.ngrok.io/Ivr/HandleTranscribedVrn) с помощьютекст транскрипции и другая транскрибированная информация.

[HttpPost]
public TwiMLResult HandleTranscribedVrn()
{
    var response = new VoiceResponse();
    try
    {
        // get the transcribed result - https://www.twilio.com/docs/voice/twiml/record#transcribe
        var result = new TranscribedResult
        {
            TranscriptionSid = Request.Params["TranscriptionSid"],
            TranscriptionText = Request.Params["TranscriptionText"],
            TranscriptionUrl = Request.Params["TranscriptionUrl"],
            TranscriptionStatus = Request.Params["TranscriptionStatus"],
            RecordingSid = Request.Params["RecordingSid"],
            RecordingUrl = Request.Params["RecordingUrl"],
            AccountSid = Request.Params["AccountSid"]
        };

        // reading the transcibed result
        response.Say("You said,\n {0}", result.TranscriptionText);

        // done
        response.Say("Good Bye", Say.VoiceEnum.Alice, null, Say.LanguageEnum.EnGb);
    }
    catch (Exception e)
    {
        ErrorLog.LogError(e, "Error within ivr/HandleTranscribedVrn");
        response.Say(ConversationHelper.NothingReceived, ConversationHelper.SpeakVoice, 1, ConversationHelper.SpeakLanguage);
    }
    return TwiML(response);
}

Короче говоря, я хочу, чтобы вышеуказанное действие обратного вызова захватывало транскрипт для голосового ввода пользователя и считывало его, как

Вы сказали: {Users VoiceTranscript - пример - abc123}, До свидания

Проблема

Когда пользователь звонит на номер twilio, он выполняет контроллер действия Welcome () и говорит

«Скажите, пожалуйста, свой идентификатор пользователя, например, ABC123, \ n и нажмите звездочку, когда закончите»

Пользователь произносит свой идентификатор пользователя - EFG456 и нажимает клавишу * как обычно.

Затемон снова говорит (бесконечно, пока пользователь не отключит вызов), не переходя к транскрибированному действию обратного вызова - HandleTranscribedVrn - «Скажите, пожалуйста, свой идентификатор пользователя, например, ABC123, \ n и нажмите star, когда закончите»

Любая помощь будет оченьоценили.

1 Ответ

0 голосов
/ 10 февраля 2019

С помощью поддержки Twilio нам удалось найти это решение.Таким образом, вместо <record> мы должны использовать функцию <gather>, предоставляемую Twilio.При сборке мы можем использовать либо речь, тональные сигналы DTMF (ввод с клавиатуры), либо оба.Метод обратного вызова сбора завершен будет выполнен, когда транскрипция речи будет готова.Дополнительную информацию можно найти по https://www.twilio.com/docs/voice/twiml/gather

Ниже приведен пример кода.Надеюсь, это будет полезно всем, кто сталкивается с подобной проблемой.

[HttpPost]
public ActionResult Welcome()
{
    var response = new VoiceResponse();
    try
    {
        var gatherOptionsList = new List<Gather.InputEnum>
        {
            Gather.InputEnum.Speech,
            //Gather.InputEnum.Dtmf
        };
        var gather = new Gather(
            input: gatherOptionsList,
            timeout: 60,
            finishOnKey:"*",
            action: Url.ActionUri("OnGatherComplete", "Ivr")
            );
        gather.Say("Please say \n", Say.VoiceEnum.Alice, 1, Say.LanguageEnum.EnGb);
        response.Append(gather);           
    }
    catch (Exception e)
    {
        ErrorLog.LogError(e, "Error within ivr/Welcome");           
    }
    return TwiML(response);
}

[HttpPost]
public TwiMLResult OnGatherComplete(string SpeechResult, double Confidence)
{
    var response = new VoiceResponse();
    try
    {
        var identifyingConfidence = Math.Round(Confidence * 100, 2);
        var transcript = $"You said {SpeechResult} with Confidence {identifyingConfidence}.\n Good Bye";
        var say = new Say(transcript);         
        response.Append(say);
    }
    catch (Exception e)
    {
        ErrorLog.LogError(e, "Error within ivr/OnGatherComplete");          
    }
    return TwiML(response);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...