https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-to-build-a-magic-8-ball-voice-app-with-ruby-dr/Magic-8-Ball_1200x600.jpg

Cómo crear una aplicación de voz Magic 8-Ball con Ruby

Publicado el May 14, 2021

Tiempo de lectura: 9 minutos

Seamos realistas. Nuestros días están constantemente llenos de preguntas difíciles:

¿Qué preparo para cenar?
¿Es esto lo mejor para mi carrera?
¿Se ha estropeado la pizza?
¿Debo contestarle?

Ser adulto es muy duro. Y francamente, es duro tener que tomar decisiones... todos todo el tiempo. ¿No sería genial poder volver a los días de la infancia en los que un simple juguete podía resolver todas las preguntas difíciles de la vida? Pero mejor aún, ¿y si lo construyes tú mismo?

En este tutorial crear una aplicación de voz Magic 8-Ball con Ruby. Esta aplicación no hará que las preguntas sean menos difíciles, pero pero facilitará el proceso de toma de decisiones.

magic eightball

Requisitos previos

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.

Además, necesitarás:

Crear una aplicación de voz Magic 8-Ball

Cómo crear tu aplicación:

  1. Crear la aplicación Rails

  2. Configurar las rutas y el controlador en la aplicación

  3. Exponga su aplicación externamente con ngrok

  4. Comprar un número de teléfono Nexmo

  5. Crear una aplicación Nexmo Voice

  6. Enlazarlo todo

  7. Ejecuta tu aplicación y responde a todas las preguntas difíciles de la vida (las de sí o no, es decir¡)!

Este tutorial te lleva a través del proceso desde cero. Si quieres ver el código terminado, puedes clonar el repositorio repositorio git de este proyecto.

Creación de la aplicación Rails

Para empezar, inicializa un nuevo proyecto de API Rails.
Desde la línea de comandos ejecute lo siguiente:

rails new magic8-ball-voice-app --api --skip-active-record

(Como no hay datos persistentes para esta aplicación, añadir la parte -api --skip-active-record ayuda a que tu aplicación sea superligera).

Muévete a la carpeta de tu nueva aplicación Rails cd magic8-ball-voice-app y ábrelo en tu editor de código preferido.

El flujo de esta aplicación

Hagamos una breve pausa para hablar del flujo de esta aplicación antes de sumergirnos en el código.

El usuario marca el número de la aplicación y se le pide que formule una pregunta. Para demostrar que está dispuesto a recibir un sabio consejo, se le pide que pulse 1 en el teclado. A continuación, la aplicación selecciona aleatoriamente una respuesta para leérsela al usuario.

Para conseguir este flujo, tendrás que crear estas acciones y rutas en tu aplicación:

  • #answerpara recibir la llamada inicial

  • #caller_inputpara responder con una respuesta seleccionada al azar a la pregunta de la persona que llama y gestionar los errores de entrada

  • #eventpara recibir el evento de la API Nexmo e imprimirlo en la consola

Ahora que el flujo de la aplicación está claro, pasemos a la parte divertida y escribamos las rutas y las acciones del controlador.

Configurar las rutas dentro de la aplicación

Para que tu aplicación sepa a dónde dirigir la solicitud de Nexmo GET debes definir las rutas en routes.rb.
Para responder a la llamada, manejar la entrada de la persona que llama, e imprimir los eventos en tu terminal necesitarás escribir tres rutas únicas.

Abrir /config/routes.rb para añadir:

# routes.rb

get '/answer', to: 'responses#answer'

post '/caller_input', to: 'responses#caller_input'

post '/event', to: 'responses#event'

Configurar el controlador dentro de la aplicación

En su terminal, ejecute el comando rails generate controller Responses.
Esto crea un nuevo Controller dentro de la carpeta /app/controllers carpeta.
Dentro de este archivo es donde crearás tus acciones:

# responses_controller.rb

class ResponsesController < ActionController::API

    # this URL is the one you use ngrok to create  
    NGROK_URL = "http://********.ngrok.io"

    # it’s up to you if there are more or less positive responses in your array
    POSSIBLE_RESPONSES = ["It is certain.", "It is decidedly so.", "Without a doubt.", "Yes, definitely.", "You may rely on it.", "As I see it, yes.", "Most likely.", "The outlook good.", "Yes.", "All signs point to yes.", "Sorry, but no.", "I really don’t think it will work out.", " Don't count on it.", "That my sources say no.", "It is very doubtful."]

    def answer
        render json:
        [
            {
                :action => 'talk',
                :text => 'Welcome to the Magic Eightball hotline. Ask your question and then press 1.',
                :bargeIn => true
            },
            {
                :action => 'input',
                :eventUrl => ["#{NGROK_URL}/caller_input"],
                :timeOut => '10'
            }
        ].to_json
    end

A continuación, tendrás que gestionar la entrada de la persona que llama.
Dual Tone Multi Frequency (DTMF) es una forma de señalización utilizada por los sistemas telefónicos para transmitir los dígitos 0-9 y los caracteres * y #. Usaremos 'dtmf' aquí para aceptar el número 1 como señal a la aplicación de que la persona que llama está lista para pasar al siguiente flujo. Si la persona que llama pulsa cualquier otra tecla o no introduce nada, la aplicación le pedirá que lo intente de nuevo.

Entonces utilizaremos el método .sample de Ruby. Esto seleccionará aleatoriamente una respuesta de la Bola 8 Mágica del POSSIBLE_RESPONSES del array.

# responses_controller.rb continued

    def caller_input
        dtmf = params['dtmf'] || parsed_body['dtmf']

        if dtmf == '1'
            render json:
            [
                {
                    :action => 'talk',
                    :text => "My answer is: #{POSSIBLE_RESPONSES.sample}. I hope that helps. Thanks for calling the Magic 8-ball hotline. Please call again whenever you need help making a decision in life. Goodbye.",
                }
            ].to_json
        else
            render json:
            [{:action => 'talk', :text => 'I did not recognize your selection. Please call back and try again.'}].to_json
        end
    end

Y finalmente, imprimamos los detalles del evento en tu terminal para propósitos de depuración.

# responses_controller.rb continued
    def event
        puts params
    end
end

Nota:
Hay una variable constante en la línea 6 del archivo responses_controller.rb que contendrá su URL ngrok. Actualmente está en blanco porque usted todavía tiene que crearlo.

Así que vamos a crearlo ahora, ¿vale?

Exponga su aplicación externamente conngrok

El objetivo ahora es exponer su aplicación externamente para que Nexmo pueda comunicarse con ella. Debido a que la aplicación sólo se ejecuta localmente, no está disponible en la máquina de nadie más. Eso significa que necesitamos de alguna manera exponer externamente nuestro servidor local para que Nexmo pueda llegar a él.
Hay un montón de maneras diferentes de hacer esto, pero una de las más simples es con ngrok. Puedes consultar este artículo para una mirada más profunda en cómo funciona todo.

Pero esto es lo esencial:

  • Descargar e instalar ngrok

  • Abrir una nueva ventana de terminal

  • Ejecute lo siguiente desde la línea de comandos:

./ngrok http 3000

Aquí, ngrok está apuntando al puerto 3000 ya que asume que su servidor local se está ejecutando en http://localhost:3000. Si está ejecutando en un puerto diferente, asegúrese de ajustar el comando ngrok.

Ahora debería ver una interfaz de registro ngrok en su ventana de terminal.

Cerca de la parte superior de la interfaz hay una línea que empieza por Forwarding y contiene dos URL. La primera es la URL de ngrok accesible desde el exterior, que termina con ngrok.io y apunta a tu servidor local.

ngrok

Copie y pegue esa URL en su archivo responses_controller.rb y actualice el archivo NGROK_URL = "http://********.ngrok.io" para que sea esa URL (la que se está ejecutando localmente en su máquina en este momento).

updated ngrok

Nota: Asegúrese de guardar su ngrok.io en un lugar seguro. También la utilizarás en los próximos pasos.

A continuación, para que su aplicación de voz funcione, debe vincular su cuenta Nexmo, un número de teléfono proporcionado y una aplicación Voice entre sí.

Comprar un número de teléfono Nexmo

  • En el Panel de control de Nexmo, haga clic en el elemento de menú Numbers del menú de la izquierda.

  • Haga clic en la opción Buy Numbers y accederá a una página en la que podrá elegir el país, las características, el tipo y los cuatro dígitos que desea que tenga el número.

    buy numbers

  • Seleccione el país en el que se encuentra para que la llamada sea local. Para las funciones, seleccione Voice y para el tipo, móvil o fijo.

  • Haga clic en Search para ver una lista de los números de teléfono disponibles.

  • Seleccione un número haciendo clic en el botón naranja Buy y volviendo a pulsar el botón naranja Buy una vez que aparezca el mensaje de confirmación.

Ya tienes un número de teléfono Nexmo. Su siguiente paso es crear una aplicación en el salpicadero Nexmo.

Crear una aplicación Nexmo

  • En el menú de la izquierda, haga clic en el Voice del menú.

  • Seleccione la Create an application opción. Se le dirigirá a una página en la que podrá configurar una nueva aplicación Nexmo.

  • Rellene el formulario con lo siguiente:
    -Application name campo de texto introducir magic8-ball-voice-app -Event URL campo de texto introduzca la URL ngrok guardada: https://[ngrok url here]/event -Answer URL campo de texto introduzca de nuevo la URL ngrok guardada: https://[ngrok url here]/answer

  • Una vez que esté todo, haga clic en el botón azul Create Application azul. [Video width="1042" height="814" mp4="https://www.nexmo.com/wp-content/uploads/2019/05/create-application.mp4"]

Enlazarlo todo

Ahora tiene un número de voz Nexmo y una aplicación, y todo lo que queda por hacer es vincular los dos juntos.

  • Seleccione la opción Numbers en el menú de la izquierda y haga clic en Your numbers para acceder a la página del número de teléfono que acaba de adquirir.

  • Haga clic en el icono del engranaje situado a la derecha de la página.

  • Seleccione Application debajo del Forward to área

  • Seleccione su nueva aplicación Nexmo en la lista desplegable situada bajo el área Application área.

  • Pulse el botón azul Ok azul.

    Tu nuevo número de voz Nexmo ya está vinculado a tu nueva aplicación Nexmo y, con este último paso, ¡ya estás listo para probarlo!

Ejecute su aplicación

Con su servidor ngrok aún funcionando en una ventana, ejecute rails s desde otra ventana en tu terminal.

Esto debería arrancar tu servidor Rails en http://localhost:3000. No hay vistas en tu aplicación, así que la única forma de interactuar con ella es llamarla.

Ahora viene lo divertido.

  • Prepara la pregunta que te ha resultado demasiado difícil responder por ti mismo.

  • Marque su nuevo número de teléfono Nexmo desde su propio teléfono.

  • Deberías escuchar a tu aplicación responder a la llamada y preguntarte el prompt del método #answer Controlador.

No dudes en experimentar con diferentes opciones y jugar con tu aplicación Nexmo. Considere la posibilidad de añadir algunas respuestas tontas a la POSSIBLE_RESPONSES o añadir una opción para obtener una respuesta diferente si a la persona que llama no le gusta la primera. ¡Enhorabuena! Ya tienes una aplicación aplicación Magic 8-Ball Voice usando Rails y la Voice API de Nexmo.

Próximos pasos

Si esto ha despertado tu interés por hacer más cosas con la voz, aquí tienes algunas ideas que puedes probar:

Compartir:

https://a.storyblok.com/f/270183/250x250/708316e4e8/laurenlee.png
Lauren LeeAntiguos alumnos de Vonage

Profesora de inglés convertida en empática ingeniera de software. Una optimista curiosa a la que le apasiona crear contenidos accesibles y ayudar a los desarrolladores a mejorar sus habilidades.