Création d’un menu vocal interactif avec Asterisk

Sélection du moteur de synthèse vocale

Il existe plusieurs moteurs de synthèse vocale : Flite (intégré à Asterisk), pass4sure e-Speak module for Asterisk, Microsoft Translator API ou Googletts (le plus poussé actuellement).
Notre choix s’est porté sur Googletts, projet libre de Google, possédant une AGI simple à utiliser mais nécessitant un accès à internet pour la génération vocale.

Installation des dépendances

Nous rappelons que nous avons installé Asterisk sur une CentOS 6.5 minimale, il manque donc certaines dépendances :

  • Perl : langage de programmation PERL
  • perl-libwww : Librairie Perl pour le WEB
  • sox : SOund eXchange, Processeur sonore
  • mpg123 : lecteur et encodeur MPG audio

Nous devons donc ajouter le dépot RPMFORGE pour CentOS 6.x

  1. Téléchargez le package :
    $ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
  2. Importez la clé de sécurity GPG :
    $ rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt 
  3. Installez le dépot:
    $ rpm -K rpmforge-release-0.5.3-1.el6.rf.*.rpm
    
  4. Installation des dépendaces requises : perl perl-libwww-perl.noarch sox.x86_64 mpg123
    $ yum install perl perl-libwww-perl.noarch sox.x86_64 mpg123

Téléchargement de Googletts

pass4sure exams

Téléchargez l’Agi googletts.agi,
Fichiers originaux sur http://zaf.github.io/asterisk-googletts/
Fichiers modifiés :
version zip (pour windows)
version tar.gz
Décompressez l’archive et copier le fichier googletts.agi dans le répertoire /var/lib/asterisk/agi-bin/

$ wget http://www.madti.info/dl/googletts.tar.gz
$ tar xvf googletts.tar.gz
$ cp googletts.agi /var/lib/asterisk/agi-bin/googletts.agi

Génération du menu vocal interactif avec Asterisk

Pour cet exemple créons un menu standard d’accueil avec choix de l’interlocuteur entre Thomas, Hervé et Gauvain.
Editez le fichier extensions.conf d’asterisk dans /etc/asterisk/. Ajoutez les lignes suivantes dans le fichier.

[accueil]
exten => 8001,1,Answer() ; asterisk decroche
exten => 8001,n,Set(TIMEOUT(response)=5) ; mise en place d'un timer de 5 secondes
exten => 8001,n,agi(googletts.agi,"Bienvenue sur ce menu interactif.",fr,any,1.3) ; message d'accueil
exten => 8001,n,agi(googletts.agi,"Qui souhaitez vous joindre ?",fr,any,1.3)
exten => 8001,n,agi(googletts.agi,"Pour Thomas tapez 1.",fr,any) ; message de premiere option
exten => 8001,n,agi(googletts.agi,"Pour Hervé tapez 2.",fr,any) ; message de seconde option
exten => 8001,n,agi(googletts.agi,"Pour Gauvain tapez 3.",fr,any) ; message de troisieme option
exten => 8001,n,agi(googletts.agi,"Pour raccrocher tapez étoile",fr,any,1.2) ; message de fin
exten => 8001,n,agi(googletts.agi,"Pour réécouter ce message tapez dièse",fr,any) ; message de repetition
exten => 8001,n,WaitExten() ; attente d'une touche
exten => 1,1,Goto(admin,1001,1) ; sur pression de la touche '1' allez dans le contexte admin et appeler 1001, a la premiere ligne du contexte
exten => 2,1,Goto(admin,1002,1) ; sur pression de la touche '2' allez dans le contexte admin et appeler 1002, a la premiere ligne du contexte
exten => 3,1,Goto(gestion,2001,1) ; sur pression de la touche '3' allez dans le contexte gestion et appeler 2001, a la premiere ligne du contexte
exten => _[4-9],1,agi(googletts.agi,"Touche non supportée. Retour au menu",fr,any,1.3) ; sur pression d'une touche de 4 à 9 inclus, message vocal
exten => _[4-9],n,Goto(accueil,8001,4) ; sur pression d'une touche de 4 à 9 inclus aller dans le contexte accueil, appeler 8001 (ce menu), a la ligne 4
exten => #,1,Goto(accueil,8001,3) ; sur pression de la touche 'diese' aller dans le contexte accueil, appeler 8001 (ce menu), a la ligne 3
exten => *,1,Hangup() ; sur pression de la touche 'etoile', racrocher
exten => t,1,Goto(accueil,8001,3) ; si le timer se termine aller dans le contexte accueil, appeler 8001 (ce menu), a la ligne 3

Test du menu

Pour tester le menu il suffit d’appeler le numéro 8001 pour avoir l’accueil.
Si tout fonctionne vous entendrez une voix féminine faire les annonces, et sur pression de la touche requise votre correspondant vous répondra.

Fichiers d’exemple

Fichier users.conf
Fichier sip.conf
Fichier extensions.conf
Pour les utiliser renommer les respectivement en users.conf, sip.conf, extensions.conf.

Bien sûr vous pouvez imbriquer des menus vocaux les uns dans les autres, en appelant un menu par un autre:

[accueil]
exten => 8001,1,Answer()
exten => 8001,n,Set(TIMEOUT(response)=5)
exten => 8001,n,agi(googletts.agi,"Bienvenue sur ce menu interactif.",fr,any,1.3)
exten => 8001,n,agi(googletts.agi,"Qui souhaitez vous joindre ?",fr,any,1.3)
exten => 8001,n,agi(googletts.agi,"Pour le service des administrateurs réseau tapez 1.",fr,any)
exten => 8001,n,agi(googletts.agi,"Pour le service des gestion tapez 2.",fr,any)
exten => 8001,n,agi(googletts.agi,"Pour le service formation tapez 3.",fr,any)
exten => 8001,n,agi(googletts.agi,"Pour raccrocher tapez étoile",fr,any,1.2)
exten => 8001,n,agi(googletts.agi,"Pour réécouter ce message tapez dièse",fr,any)
exten => 8001,n,WaitExten()
exten => 1,1,Goto(accueil-admin,8002,1)
exten => 2,1,Goto(accueil-gestion,8003,1)
exten => 3,1,Goto(accueil-forma,8004,1)
exten => _[4-9],1,agi(googletts.agi,"Touche non supportée. Retour au menu",fr,any,1.3)
exten => _[4-9],n,Goto(accueil,8001,4)
exten => #,1,Goto(accueil,8001,3)
exten => *,1,Hangup()
exten => t,1,Goto(accueil,8001,3)

[accueil-admin]
exten => 8002,1,Answer()
exten => 8002,n,Set(TIMEOUT(response)=5)
exten => 8002,n,agi(googletts.agi,"Bienvenue au service administration réseau.",fr,any,1.3)
exten => 8002,n,agi(googletts.agi,"Pour Thomas tapez 1.",fr,any)
exten => 8002,n,agi(googletts.agi,"Pour Hervé tapez 2.",fr,any)
exten => 8002,n,agi(googletts.agi,"Pour Gauvain tapez 3.",fr,any)
exten => 8002,n,agi(googletts.agi,"pooour revenir au menu précédent tapez étoile",fr,any)
exten => 8002,n,WaitExten()
exten => 1,1,Goto(admin,1001,1)
exten => 2,1,Goto(admin,1002,1)
exten => 3,1,Goto(admin,1003,1)
exten => _[4-9#],1,agi(googletts.agi,"Touche non supportée. Retour au menu",fr,any,1.3)
exten => _[4-9#],n,Goto(accueil-admin,8002,3)
exten => *,1,agi(googletts.agi,"Retour au menu précédent",fr,any)
exten => *,n,Goto(accueil,8001,1)
exten => t,1,Goto(accueil-admin,8002,3)