VoiceXML выдает «внутреннюю ошибку», но очевидная ошибка не отображается - PullRequest
2 голосов
/ 13 апреля 2019

Я создал этот код VoiceXML, чтобы попросить пользователя ввести некоторые данные, которые затем должны быть сохранены в базе данных.

Когда я запускаю код через Postman для имитации запроса, я не получаю никаких ошибок назад. Но когда я действительно запускаю и вызываю голосовое приложение Python / Django, я получаю «внутреннюю ошибку», когда мое приложение достигает этой части.

Вывод VoiceXML:

<?xml version="1.0" encoding="UTF-8"?>
<!--- <vxml version = "2.1" > -->
<!DOCTYPE vxml SYSTEM "http://www.w3.org/TR/voicexml21/vxml.dtd">
<vxml xmlns="http://www.w3.org/2001/vxml"
  version="2.1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.w3.org/2001/vxml
  http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd">
    <!---<property name="inputmodes" value="dtmf" /> -->
    <!-- Kasadaka VoiceXML File -->
    <form id="input_form">
        <property name="inputmodes" value="dtmf" />
        <property name="interdigittimeout" value="2s"/>
        <property name="timeout" value="4s"/>
        <property name="termchar" value="#" />
        <field name="DTMF_input" type="digits?maxlength=5">
            <prompt>
                <audio src="/uploads/petrichor_here_you_can_fill_in_your_farmer_id_en_QL7Xu6T.wav"/>
            </prompt>
        </field>
        <block>
            <prompt>
                <audio src="/uploads/petrichor_thank_you_for_your_input_en_rFaZyF5.wav"/>
            </prompt>
            <filled namelist="DTMF_input">
                <submit src=" /vxml/InputData/34/18" namelist="DTMF_input" method="post"/>
            </filled>
        </block>
    </form>
</vxml>

И при необходимости код, который должен сохранить ввод:

def InputData(request, element_id, session_id):
    input_element = get_object_or_404(InputData_model, pk=element_id)
    voice_service = input_element.service
    session = lookup_or_create_session(voice_service, session_id)


    if request.method == "POST":
        session = get_object_or_404(CallSession, pk=session_id)

        value = 'DTMF_input'

        result = UserInput()

        result.session = session

        result.category = input_element.input_category 

        result.save()

        return redirect(request.POST['redirect'])

    session.record_step(input_element)
    context = input_generate_context(input_element, session)

    context['url'] = request.get_full_path(False)

    return render(request, 'input.xml', context, content_type='text/xml')

Верен ли мой код VoiceXML, если я хочу, чтобы пользователь мог вводить числа через DTMF, а затем сохранять эти данные в моей модели? Или я что-то упустил, чтобы это работало?

РЕДАКТИРОВАТЬ: Журналы ошибок:

============================================================
Error Summary
============================================================
An error occurred while executing the following dialog.

Initial URL1:               http://petrichor-rain-system.herokuapp.com/vxml/start/3
Initial URL2:               null
Initial URL3:               null
Current URL:                /vxml/choice/35/26
Calling Number (ANI):       447520631888
Called Number (DNIS):       9991494860
Redirecting Number (RDNIS): ""
State:                      hello-and-welcome
VoiceXML Browser Version:   16.0.25.88606
Date/Time:                  2019/4/18  10:4:29.387

VoiceException:
    error.badfetch
    Could not compile document: http://petrichor-rain-system.herokuapp.com/vxml/InputData/33/26


Dialog stack trace:
    State (Dialog)          URL (Document)
    --------------          ------------------------------
    hello-and-welcome       http://petrichor-rain-system.herokuapp.com/vxml/choice/35/26




============================================================
Current Document
============================================================

<?xml version="1.0" encoding="UTF-8"?>
<!--- <vxml version = "2.1" > -->
<!DOCTYPE vxml SYSTEM "http://www.w3.org/TR/voicexml21/vxml.dtd">
<vxml xmlns="http://www.w3.org/2001/vxml"
  version="2.1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.w3.org/2001/vxml
  http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd">

<meta name="maintainer" content="email" />

<property name="inputmodes" value="dtmf" />

<!-- Kasadaka VoiceXML File -->




<form  id="hello-and-welcome">
        <field name="choice">
                <prompt>
                        <audio src="/uploads/petrichor_hello_welcome_en_AwoXmq3.wav"/>

                                <audio src="/uploads/pre_choice_option_en.wav"/>
                                <audio src="/uploads/petrichor_press_one_to_listen_to_explanation_en_L6iqUHW.wav"/>
                                <audio src="/uploads/post_choice_option_en.wav"/>
                        <audio src="/uploads/1_en.wav"/>

                                <audio src="/uploads/pre_choice_option_en.wav"/>
                                <audio src="/uploads/petrichor_press_two_to_fill_in_collected_data_en_zXRGSby.wav"/>
                                <audio src="/uploads/post_choice_option_en.wav"/>
                        <audio src="/uploads/2_en.wav"/>

                                <audio src="/uploads/pre_choice_option_en.wav"/>
                                <audio src="/uploads/petrichor_press_three_to_stop_the_call_en_bOL0PDC.wav"/>
                                <audio src="/uploads/post_choice_option_en.wav"/>
                        <audio src="/uploads/3_en.wav"/>

</prompt>


<grammar xml:lang="en-US" root = "MYRULE" mode="dtmf">
      <rule id="MYRULE" scope = "public">
        <one-of>

            <item>1</item>

            <item>2</item>

            <item>3</item>

        </one-of>
       </rule>
</grammar>


<filled>


      <if cond="choice == '1'">

      <goto next="/vxml/message/18/26"/>



      <elseif cond="choice == '2'" />
      <goto next="/vxml/InputData/33/26"/>



      <elseif cond="choice == '3'" />
      <goto next="/vxml/choice/22/26"/>




    <else/>
    </if>
  </filled>

</field>
</form>


</vxml>

1 Ответ

1 голос
/ 13 апреля 2019

Чтобы отправить результаты обратно на сервер, вам нужно использовать элемент submit, а не элемент goto.

<submit src="/vxml/InputData/34/8" namelist="DTMF_input" method="post"/>

См. Подробности в спецификации VoiceXML .

...