by AVS International — Modified by Francisco Rivas

Tutorial AVS: Indicadores de Estado utilizando sonidos en Raspberry Pi

Francisco Rivas
Diseñando para la Voz
12 min readJan 2, 2019

--

Uno de los aspectos más importantes que debemos tener en cuanta cuando diseñamos una interfaz de usuario, bien sea gráfica, auditiva o incluso multi-modal, es el feedback que recibe el usuario por parte de la máquina como respuesta ante una orden o solicitud. En caso de las interfaces auditivas, la reproducción de un clip de audio puede ser bastante útil para indicar el inicio o la finalización de una actividad, la disponibilidad del dispositivo para recibir una nueva orden o solicitud e incluso el progreso del cumplimiento de estas.

¿Qué vamos a hacer en este tutorial?

Vamos a modificar la interfaz de usuario que viene por defecto en la aplicación de ejemplo que obtenemos al instalar AVS en nuestra Raspberry Pi y vamos a hacer que Alexa reproduzca un par de clips de audio en algunos estados.

Pre-requisitos

- Tener instalado el SDK de AVS en nuestra Raspberry. Si aún no lo tienes instalado, te sugiero seguir este excelente tutorial.

Photo by rawpixel on Unsplash

Es un asunto de Estado

Cuando ejecutamos la aplicación de ejemplo que viene con el SDK de AVS y utilizamos la palabra de activación o incluso t ↩︎ para simplemente hacer nuestra solicitud, observamos que Alexa pasa por varios estados.

Estos estados son:

  • IDLE: Alexa está lista para interactuar.
  • Listening: Alexa está escuchando.
  • Expecting: Alexa está esperando respuesta del usuario.
  • Thinking: Sucede cuando el usuario ya ha realizado su solicitud y no se espera mas nada. Alexa esta esperando por una respuesta de AVS.
  • Speaking: Alexa está respondiendo a una solicitud.
  • Finished: Se considera un estado intermedio. Sucede luego de que la directiva `Speak` es completada. En el caso de varias directivas de este tipo, se reproducen una tras otra; en el caso de ser la última Alexa pasa a IDLE. No se hace nada en especial en este estado.

Por defecto, la UX que se implementa en la aplicación de ejemplo SampleApp cuando instalamos AVS no implementa indicadores visuales o auditivos. En las referencias puedes encontrar más información acerca de los estados.

Indicadores de atención

Existen 3 tipos de indicadores de atención

  1. Aquellos que utilizan los LEDs multi-colores
    Existen 3 tipos: los radiales, lineales y simples. Se recomienda ampliamente utilizar los radiales, aunque, por supuesto, depende de la implementación en hardware.
  2. Aquellos conocidos como Voice Chrome
    Se recomienda su utilización en dispositivos con pantalla. Se combina con la utilización de las DisplayCards.
  3. Aquellos que solo utilizan sonidos
    Sin duda, es el que se recomienda por defecto en todos los dispositivos, aquellos que tienen pantalla y los que no; sin embargo, en la guía de diseño sugieren que se utilice más de un indicador de atención en aquellos dispositivos cuya activación se realiza con la voz exclusivamente. Esto se debe a que es posible que no pueda evitar la ambigüedad de sonidos para varios estados.
Photo by rawpixel on Unsplash

Manos a la obra

Lo primero que necesitamos hacer es descargar una pequeña librería de sonidos que ofrece Amazon para AVS. En ella encontraremos varios archivos de sonido, digamos que estándar.

Desde nuestro AVS Dashboard vamos a Resources(1).

Seleccionamos ‘Resources’

De la lista de recursos, descargamos Alexa sound library for AVS (v.12)(2).

Descargamos la libreria de sonidos para AVS

Click en Download(3). Guarda el archivo zip en algún sitio de tu disco fácil de localizar. Esto también puedes hacerlo utilizando el navegador de Raspbian.

Click en Download

En mi caso, me conecto a mi Raspberry Pi por SSH por lo que tengo que copiar el archivo por SFTP.

Transferencia de la libreria a mi R-Pi

Una vez copiado el archivo, lo descomprimimos así:

$ unzip Alexa\ Sound\ Library\ for\ AVS.zip -x ‘__MACOS*’**
Archive: Alexa Sound Library for AVS.zip
creating: Alexa Sound Library for AVS/
inflating: Alexa Sound Library for AVS/.DS_Store
inflating: Alexa Sound Library for AVS/Alexa sound library for AVS.pdf
creating: Alexa Sound Library for AVS/ful/
inflating: Alexa Sound Library for AVS/ful/ful_alerts_notification_01.mp3
inflating: Alexa Sound Library for AVS/ful/ful_alerts_notification_03.mp3
inflating: Alexa Sound Library for AVS/ful/ful_state_bluetooth_connected.mp3
inflating: Alexa Sound Library for AVS/ful/ful_state_bluetooth_disconnected.mp3
inflating: Alexa Sound Library for AVS/ful/ful_state_privacy_mode_off.wav
inflating: Alexa Sound Library for AVS/ful/ful_state_privacy_mode_on.wav
inflating: Alexa Sound Library for AVS/ful/ful_system_alerts_melodic_01.mp3
inflating: Alexa Sound Library for AVS/ful/ful_system_alerts_melodic_01_short.wav
inflating: Alexa Sound Library for AVS/ful/ful_system_alerts_melodic_02.mp3
.
.
.
<resto de salida eliminada por espacio>

¿Qué tenemos en el directorio?


$ ls -1
Alexa sound library for AVS.pdf
ful/
license.txt
med/
sml/
  • ful/ med/ sml/: Contienen archivos de audio *,mp3 y *.wav. De acuerdo a la documentación, la diferencia entre los archivos que encontramos en cada directorio es la calidad de estos. He comprobado esta información:

/ful $ ls -larth
total 2.1M
-rw-r — r — 1 pi pi 94K Jul 31 22:36 ful_utility_500ms_blank.wav
-rw-r — r — 1 pi pi 122K Jul 31 22:36 ful_ui_wakesound.wav
-rw-r — r — 1 pi pi 89K Jul 31 22:36 ful_ui_wakesound_touch.wav
-rw-r — r — 1 pi pi 132K Jul 31 22:36 ful_ui_endpointing.wav
-rw-r — r — 1 pi pi 132K Jul 31 22:36 ful_ui_endpointing_touch.wav
-rw-r — r — 1 pi pi 376K Jul 31 22:36 ful_system_alerts_melodic_02_short.wav
-rw-r — r — 1 pi pi 190K Jul 31 22:36 ful_system_alerts_melodic_02.mp3
-rw-r — r — 1 pi pi 376K Jul 31 22:36 ful_system_alerts_melodic_01_short.wav
-rw-r — r — 1 pi pi 190K Jul 31 22:36 ful_system_alerts_melodic_01.mp3
-rw-r — r — 1 pi pi 66K Jul 31 22:36 ful_state_privacy_mode_on.wav
-rw-r — r — 1 pi pi 85K Jul 31 22:36 ful_state_privacy_mode_off.wav
-rw-r — r — 1 pi pi 40K Jul 31 22:36 ful_state_bluetooth_disconnected.mp3
-rw-r — r — 1 pi pi 43K Jul 31 22:36 ful_state_bluetooth_connected.mp3
-rw-r — r — 1 pi pi 56K Jul 31 22:36 ful_alerts_notification_03.mp3
-rw-r — r — 1 pi pi 46K Jul 31 22:36 ful_alerts_notification_01.mp3

Debo decir que no observo tal diferencia, a excepción de sml_ui_wakesound.wav que se diferencia en 33K aproximadamente de los demás ( medy ful).

Luego mirando la información del archivo de audio en cuestión:


$ file ful/ful_alerts_notification_01.mp3
ful/ful_alerts_notification_01.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 256 kbps, 48 kHz, JntStereo
$ file med/med_alerts_notification_01.mp3
med/med_alerts_notification_01.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 256 kbps, 48 kHz, JntStereo
$ file sml/sml_alerts_notification_01.mp3
sml/sml_alerts_notification_01.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 256 kbps, 48 kHz, JntStereo

La verdad no he podido notar una diferencia importante. Decidí probar por ultima vez con otra herramienta:


$ sox — i ful/ful_ui_wakesound.wav
Input File : ‘ful/ful_ui_wakesound.wav’
Channels : 2
Sample Rate : 48000
Precision : 16-bit
Duration : 00:00:00.65 = 31065 samples ~ 48.5391 CDDA sectors
File Size : 124k
Bit Rate : 1.54M
Sample Encoding: 16-bit Signed Integer PCM

$ sox — i med/med_ui_wakesound.wav
Input File : ‘med/med_ui_wakesound.wav’
Channels : 2
Sample Rate : 48000
Precision : 16-bit
Duration : 00:00:00.65 = 31065 samples ~ 48.5391 CDDA sectors
File Size : 124k
Bit Rate : 1.54M
Sample Encoding: 16-bit Signed Integer PCM

$ sox — i sml/sml_ui_wakesound.wav
Input File : ‘sml/sml_ui_wakesound.wav’
Channels : 2
Sample Rate : 48000
Precision : 16-bit
Duration : 00:00:00.47 = 22653 samples ~ 35.3953 CDDA sectors
File Size : 90.7k
Bit Rate : 1.54M
Sample Encoding: 16-bit Signed Integer PCM

De nuevo es el archivo sml_ui_wakesound.wav el que se diferencia. He reportado esto aquí.

He decidido utilizar un par de archivos de audio con formato mp3 y wav respectivamente. En la documentación se sugiere utilizar aplicaciones del sistema operativo para reproducir los archivos de audio, específicamente play.

El comando play funciona perfectamente para archivos wav.

Para poder reproducir archivos mp3 tenemos varias opciones sox (utilizando play) y mpg123, entre otras. En un principio he utilizado mpg123, sin embargo, aunque reproducía el archivo, la salida en la terminal (logs) no era muy clara. Investigando un poco me di cuenta de que play también puede reproducir mp3 aunque pensaba que no por el error que me estaba arrojando, en mis primeras pruebas:

play FAIL formats: no handler for file extension `mp3'

Lo que hice fue instalar una librería que le da a play la capacidad de reproducir mp3. Et voilà!

$ sudo apt-get install libsox-fmt-mp3
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
libsox-fmt-mp3
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 52.1 kB of archives.
After this operation, 71.7 kB of additional disk space will be used.
Get:1 http://ftp.cica.es/mirrors/Linux/raspbian/raspbian stretch/main armhf libsox-fmt-mp3 armhf 14.4.1-5 [52.1 kB]
Fetched 52.1 kB in 2s (17.5 kB/s)
Selecting previously unselected package libsox-fmt-mp3:armhf.
(Reading database ... 155172 files and directories currently installed.)
Preparing to unpack .../libsox-fmt-mp3_14.4.1-5_armhf.deb ...
Unpacking libsox-fmt-mp3:armhf (14.4.1-5) ...
Setting up libsox-fmt-mp3:armhf (14.4.1-5) ...
$ play sounds/ful_alerts_notification_01.mp3
sounds/ful_alerts_notification_01.mp3:
File Size: 46.2k Bit Rate: 256k
Encoding: MPEG audio
Channels: 2 @ 16-bit
Samplerate: 48000Hz
Replaygain: off
Duration: 00:00:01.44
In:99.7% 00:00:01.44 [00:00:00.00] Out:69.1k [ | ] Hd:3.9 Clip:0
Done.

He seleccionado ful_ui_wakesound.wav y ful_alerts_notifications_01.mp3. Los copiamos al directorio sounds/, ubicado en el mismo directorio que el SDK, esto no es imprescindible pero es recomendable por tener todo un poco más organizado.

$ cp ful_ui_wakesound.wav ful_alerts_notification_01.mp3 /home/pi/Downloads/sounds/
$ ls -1 sounds/
ful_ui_wakesound.wav
ful_alerts_notification_01.mp3

Modificando la UI

El siguiente paso, es modificar el archivo UIManager.cpp que se encuentra en el directorio src de la aplicación de ejemplo SampleApp:

Por supuesto, puedes utilizar el editor de tu preferencia, yo prefiero vim.

$ vim avs-device-sdk/SampleApp/src/UIManager.cpp

Nota: Es importante que la aplicación no se este ejecutando al momento de hacer los cambios.

Agregar la librería cstdlib(1).

Esta librería proporciona acceso a funciones como int system(const char* command); que vamos a utilizar para ejecutar la aplicación que se encarga de reproducir el archivo de audio. Viene de stdlib.h original de C, ahora en C++.

Agregamos la siguiente línea:

#include <cstdlib>

Así:

Agregar la directiva de reproducción en el estado de nuestra preferencia

Para ello buscamos la siguiente función:

void UIManager::printState()

La podemos encontrar alrededor de la linea 565, hacia el final del archivo. En vim, ESC :565para ir directamente a ella. Encontramos algo como:


void UIManager::printState() {
if (m_connectionStatus == avsCommon::sdkInterfaces::ConnectionStatusObserverInterface::Status::DISCONNECTED) {
ConsolePrinter::prettyPrint(“Client not connected!”);
} else if (m_connectionStatus == avsCommon::sdkInterfaces::ConnectionStatusObserverInterface::Status::PENDING) {
ConsolePrinter::prettyPrint(“Connecting…”);
} else if (m_connectionStatus == avsCommon::sdkInterfaces::ConnectionStatusObserverInterface::Status::CONNECTED) {
switch (m_dialogState) {
case DialogUXState::IDLE:
ConsolePrinter::prettyPrint(“Alexa is currently idle!”);
return;
case DialogUXState::LISTENING:
ConsolePrinter::prettyPrint(“Listening…”);
return;
case DialogUXState::EXPECTING:
ConsolePrinter::prettyPrint(“Expecting…”);
return;
case DialogUXState::THINKING:
ConsolePrinter::prettyPrint(“Thinking…”);
return;
case DialogUXState::SPEAKING:
ConsolePrinter::prettyPrint(“Speaking…”);
return;
/*
* This is an intermediate state after a SPEAK directive is completed. In the case of a speech burst the
* next SPEAK could kick in or if its the last SPEAK directive ALEXA moves to the IDLE state. So we do
* nothing for this state.
*/
case DialogUXState::FINISHED:
return;
}
}
}

Como podemos observar, tenemos los estados que mencioné más arriba. Debido a un posible bug, reportado aquí, decidí poner la reproducción del archivo en los estados LISTENING y THINKING así cuando Alexa está lista para escuchar y cuando espera respuesta de AVS, reproduce los archivos audio.

Ahora, puedo modificar UIManager.cpp para incluir la llamada a la función system que se encargará de hacer la llamada a la aplicación que reproduce los archivos de audio.

Vamos a agregar un par de sonidos a los estados LISTENING y THINKING respectivamente.

system(“play /path/to/file/ful_alerts_notification_01.mp3”);
system(“play /path/to/file/ful_ui_wakesound.wav”);

Resultando algo como:

case DialogUXState::LISTENING:
ConsolePrinter::prettyPrint("Listening...");
system("play /path/to/sounds/ful_alerts_notification_01.mp3");
return;
.
.
.
case DialogUXState::THINKING:
ConsolePrinter::prettyPrint(“Thinking…”);
system(“play /path/to/sounds/ful_ui_wakesound.wav”);
return;
case DialogUXState::SPEAKING:
.
.
.

Sugiero probarlo en otros estados. Es genial!

Ahora necesitamos recompilar la aplicación

Cambiamos el propietario de todos los archivos dentro del directorio donde tenemos el SDK entero:

$ sudo chown -R pi:pi /path/to/sdk

Cambiamos al directorio donde se alojan los archivos que especifican cómo compilar cada componente del SDK e incluso la aplicación de ejemplo. Son archivos CMake.

En mi caso se encuentra en /home/pi/Downloads/build/SampleApp. Una vez allí ejecutamos make:


$ make
[ 35%] Built target AVSCommon
[ 38%] Built target SQLiteStorage
[ 38%] Built target RegistrationManager
[ 40%] Built target CBLAuthDelegate
[ 45%] Built target ACL
[ 47%] Built target ADSL
[ 50%] Built target AFML
[ 52%] Built target CertifiedSender
[ 54%] Built target DeviceSettings
[ 57%] Built target EqualizerImplementations
[ 57%] Built target ContextManager
[ 57%] Built target CapabilitiesDelegate
[ 59%] Built target PlaylistParser
[ 61%] Built target KWD
[ 61%] Built target SENSORY
[ 61%] Built target KeywordDetectorProvider
[ 61%] Built target SpeechEncoder
[ 64%] Built target AIP
[ 66%] Built target AudioResources
[ 71%] Built target Alerts
[ 71%] Built target AudioPlayer
[ 73%] Built target Bluetooth
[ 76%] Built target DoNotDisturbCA
[ 76%] Built target Equalizer
[ 76%] Built target ExternalMediaPlayer
[ 78%] Built target InteractionModel
[ 80%] Built target Notifications
[ 83%] Built target PlaybackController
[ 83%] Built target SpeakerManager
[ 83%] Built target SpeechSynthesizer
[ 83%] Built target Settings
[ 85%] Built target AVSSystem
[ 88%] Built target TemplateRuntime
[ 88%] Built target DefaultClient
[ 92%] Built target MediaPlayer
[ 92%] Built target ESP
Scanning dependencies of target SampleApp
[ 92%] Building CXX object SampleApp/src/CMakeFiles/SampleApp.dir/UIManager.cpp.o
[ 92%] Linking CXX executable SampleApp
[100%] Built target SampleApp

Observamos cómo el compilador reconstruye el ejecutable de SampleApp.

Ejecutamos la aplicación y probamos

$ sudo bash startsample.sh

Además de la salida de una ejecución estándar, podemos observar que cuando Alexa cambia al estado LISTENING reproduce el archivo de audio que hemos especificado:

############################
# Listening... #
############################
2018-12-29 18:59:48.083 [ 1a] 9 ContextManager:updateStateLocked:action=updatedState,namespace=AudioActivityTracker,name=ActivityState
2018-12-29 18:59:48.089 [ e] 5 TemplateRuntime:onDialogUXStateChanged:state=LISTENING
2018-12-29 18:59:48.089 [ 17] 9 ContextManager:updateStateLocked:action=updatedState,namespace=ExternalMediaPlayer,name=ExternalMediaPlayerState
2018-12-29 18:59:48.091 [ 15] 9 ContextManager:buildContextIgnored:namespace=VisualActivityTracker,name=ActivityState
2018-12-29 18:59:48.092 [ 15] 9 ContextManager:buildContextIgnored:namespace=AudioActivityTracker,name=ActivityState
2018-12-29 18:59:48.093 [ 15] 5 ContextManager:buildContextSuccessful
2018-12-29 18:59:48.094 [ 21] 0 AudioInputProcessor:executeOnContextAvailable
2018-12-29 18:59:48.094 [ 21] 1 FocusManager:acquireChannel:channelName=Dialog,interface=SpeechRecognizer
2018-12-29 18:59:48.096 [ 22] 9 AudioInputProcessor:onFocusChanged:newFocus=FOREGROUND
2018-12-29 18:59:48.099 [ 22] 5 AudioActivityTracker:notifyOfActivityUpdates
2018-12-29 18:59:48.100 [ 1a] 5 AudioActivityTracker:executeNotifyOfActivityUpdates
2018-12-29 18:59:48.101 [ 21] I DirectiveProcessor:setDialogRequestIdLocked:oldValue=,newValue=881c04b0-1365-413a-8e2b-d15c7567bc61
2018-12-29 18:59:48.101 [ 21] 0 DirectiveProcessor:scrubDialogRequestIdLocked:reason=emptyDialogRequestId
2018-12-29 18:59:48.103 [ 21] 0 EventBuilder:buildJsonEventString:messageId=10dfbcff-322c-442f-9aa8-2ef76509299b,namespace=SpeechRecognizer,name=Recognize
2018-12-29 18:59:48.108 [ 21] 0 AudioInputProcessor:executeOnFocusChanged:newFocus=FOREGROUND
2018-12-29 18:59:48.108 [ 21] 5 HTTP2Transport:send
2018-12-29 18:59:48.109 [ 21] 5 HTTP2Transport:enqueueRequest:beforeConnected=false
2018-12-29 18:59:48.109 [ 1f] 5 MessageRequestHandler:create:context=0x722020cc,messageRequest=0x72bc7694
2018-12-29 18:59:48.109 [ 1f] 5 ExchangeHandler:ExchangeHandler:context=0x722020cc
2018-12-29 18:59:48.109 [ 1f] 5 MessageRequestHandler:MessageRequestHandler:context=0x722020cc,messageRequest=0x72bc7694
2018-12-29 18:59:48.110 [ 1f] 5 HTTP2MimeRequestEncoder:HTTP2MimeRequestEncoder:boundary=WhooHooZeerOoonie!,source=0x8faf5c
2018-12-29 18:59:48.110 [ 1f] 5 MimeResponseSink:MimeResponseSink:handler=0x8faf60
2018-12-29 18:59:48.110 [ 1f] 5 HTTP2MimeResponseDecoder:HTTP2MimeResponseDecoder
2018-12-29 18:59:48.110 [ 1f] 5 HTTP2Transport:onMessageRequestSent:countOfUnfinishedMessageHandlers=1
2018-12-29 18:59:48.110 [ 1f] 5 HTTP2Transport:createAndSendRequest:type=POST,url=https\://avs-alexa-eu.amazon.com/v20160207/events
2018-12-29 18:59:48.111 [ 1f] 5 HTTP2MimeRequestEncoder:getRequestHeaderLines
2018-12-29 18:59:48.111 [ 1f] 5 MessageRequestHandler:getRequestHeaderLines
2018-12-29 18:59:48.111 [ 1f] 5 HTTP2Transport:onActivity
/home/pi/Downloads/sounds/ful_alerts_notification_01.mp3:File Size: 46.2k Bit Rate: 256k
Encoding: MPEG audio
Channels: 2 @ 16-bit
Samplerate: 48000Hz
Replaygain: off
Duration: 00:00:01.44
In:0.00% 00:00:00.00 [00:00:01.44] Out:0 [ | ] Clip:0
Done.

Luego cuando Alexa espera respuesta de AVS, que corresponde al estado THINKING, los siguientes mensajes aparecen:


###########################
# Thinking… #
###########################
2018–12–29 13:42:36.332 [ e] 5 TemplateRuntime:onDialogUXStateChanged:state=THINKING
2018–12–29 13:42:36.333 [ 1d] 9 HTTP2MimeRequestEncoder:setState:state=SENDING_END_BOUNDARY,newState=GETTING_NTH_PART_HEADERS
2018–12–29 13:42:36.332 [ 21] 0 DirectiveProcessor:onHandlingCompeted:messageId=335e1550-fcb5–4853-b175-fbc948f3f91a,directiveBeingPreHandled=(nullptr)
2018–12–29 13:42:36.342 [ 1d] 5 MessageRequestHandler:getMimePartHeaderLines
2018–12–29 13:42:36.343 [ 21] 0 CapabilityAgent:removingMessageIdFromMap:messageId=335e1550-fcb5–4853-b175-fbc948f3f91a
2018–12–29 13:42:36.343 [ 1d] 5 HTTP2Transport:onActivity
2018–12–29 13:42:36.343 [ 1d] 9 HTTP2MimeRequestEncoder:setState:state=GETTING_NTH_PART_HEADERS,newState=SENDING_TERMINATING_DASHES
2018–12–29 13:42:36.344 [ 1d] 9 HTTP2MimeRequestEncoder:setState:state=SENDING_TERMINATING_DASHES,newState=DONE
2018–12–29 13:42:36.345 [ 1d] 9 LibcurlHTTP2Request:readCallback:id=AVSEvent-17,size=1,nmemb=16384,userData=0x72a1fed0
2018–12–29 13:42:36.345 [ 1d] 5 HTTP2MimeRequestEncoder:onSendData:size=16384,state=DONE
/home/pi/Downloads/sounds/ful_ui_wakesound.wav:File Size: 124k Bit Rate: 1.54M
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 48000Hz
Replaygain: off
Duration: 00:00:00.65
In:100% 00:00:00.65 [00:00:00.00] Out:31.1k [ | ] Clip:0
Done.

Sugiero subirle un poco el volumen a los altavoces, es un sonido bastante sutil.

En este artículo

  • Descargamos del area de Resourcesde AVS una pequeña librería de sonidos.
  • Seleccionamos el estado en el que queremos que Alexa reprodujese el archivo de audio.
  • Instalamos una librería adicional de sox que nos permite reproducir mp3.
  • Modificamos los casos LISTENING y THINKING del archivo UIManager.cpp para darle a Alexa la capacidad de reproducir los archivos que seleccionamos.
  • Reconstruimos la aplicación de ejemplo para generar un nuevo ejecutable y poder probar los cambios.
  • Realizamos una prueba en la que Alexa, en efecto, reproduce los archivos.

Referencias

Muchas gracias por leer.

Escribió para Diseñando para la Voz, Francisco.

¿Estás trabajando en algún proyecto con AVS?, ¿Hardware propio?. Estamos encantados de conocerlo, déjanos un comentario.

--

--

Francisco Rivas
Diseñando para la Voz

Alexa Developer | Coffee Enthusiast | Percussionist | Curious (life, tech) | Keen on learning