Voir la version complète : [SOLVED] [1.4] Lecture d'un numéro à la française?
littlebigman
08/03/2011, 13h48
Bonjour
J'ai besoin d'écrire un script qui demande à l'appelé de taper un numéro, puis le lui relire afin de confirmer:
;Attend numéro à 4 chiffres, 2 essais, time-out de 20s
exten => s,n(nbr2call),Read(NBR2CALL,please-type-number,4,,2,20)
exten => s,n,GotoIf($[${LEN(${NBR2CALL})} != 4]?end)
;exten => s,n,SayDigits(${NBR2CALL})
exten => s,n,SayNumber(${NBR2CALL})
exten => s,n(end),Hangup()
Outre que je n'ai que les fichiers US dans /var/lib/asterisk/sounds/digits/, je me demandais comment procéder pour que le numéro soit énoncé selon l'habitude française : par exemple, pour le 061243, ça donne "zéro-un, douze, quarante-trois" là où les Américains énoncent chaque chiffre indépendamment.
Quelqu'un a-t-il déjà regardé et trouvé comment faire?
Merci.
ffossard
08/03/2011, 15h15
Regarde dans le fichier say.conf :wink:
littlebigman
09/03/2011, 15h53
Merci. Après avoir copié le fichier say.conf dans le /etc/asterisk de ma 1.4.21.2, j'utilise la fonction SayNumber() dans extensions.conf, mais il lit les chiffres comm un numéro "normal" plutôt qu'un numéro de téléphone:
;"142.928.100"
exten => 3333,1,SayNumber(0142928100)
exten => 3333,n,Hangup
Voici mon say.conf:
www.pastebin.com/gCYYt0he
FWIW, j'ai bien "language=fr" dans zapata.conf et sip.conf.
Dois-je faire quelque chose de particulier pour qu'il lise les numéros à la française?
Merci.
littlebigman
09/03/2011, 16h12
Je viens de voir mentionné cette section, que j'ai ajoutée à say.conf même s'il semble que c'est le choix par défaut:
;/etc/asterisk/say.conf
[general]
; method for playing numbers and dates
; old - using asterisk core function
; new - using this configuration file
mode=new
...
Mais ça donne toujours "142 millions, etc." :-/
littlebigman
09/03/2011, 23h04
Bizaremment, très peu d'information sur le Net sur le fonctionnement de say.conf.
Asterisk -vvvvvvvggc indique que say.conf est bien chargé.
Je suis le premier à avoir besoin d'utiliser la fonction SayNumber() pour répéter un numéro à la française?
ffossard
10/03/2011, 11h32
Après avoir copié le fichier say.conf dans le /etc/asterisk
Il n'y était pas déjà ? :heink:
Il ne suffit pas d'activer le nouveau mode de fonctionnement dans say.conf, il faut faire comprendre à Asterisk que les chiffres du numéro doivent être lus "deux par deux"
Dans say.conf il y'a cette partie intéressante:
_pho[n]e:XXXX => num:${SAY:0:2}, num:${SAY:2:2}
_pho[n]e:0[1-9]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}
_pho[n]e:. => digit:${SAY}
Il faut que tu réussisse à utiliser cela.
L'exemple de cette page devrait t'aider:
http://www.voip-info.org/wiki/view/Asterisk+config+say.conf
Set(CHANNEL(language)=hu);
Playback(num:5|say);
Wait(0.5);
Playback(num:510|say);
Wait(0.5);
littlebigman
10/03/2011, 12h42
Merci pour ton aide
Il n'y était pas déjà ? :heink:
Non parce que c'est un Linux/Asterisk embarqué, donc nécessité de n'installer que les fichiers vraiment indispensables.
Il ne suffit pas d'activer le nouveau mode de fonctionnement dans say.conf, il faut faire comprendre à Asterisk que les chiffres du numéro doivent être lus "deux par deux"
C'est là que ça coince : je n'arrive pas à piger l'interaction entre extensions.conf et say.conf, et la logique de say.conf.
Set(CHANNEL(language)=hu);
Playback(num:5|say);
Wait(0.5);
Playback(num:510|say);
Wait(0.5);
Tu veux dire que l'on n'utilise pas SayNumber() mais Playback() pour relire un numéro de téléphone à l'appelant?
Merci.
littlebigman
10/03/2011, 13h10
Marche toujours pas :-/
extensions.conf:
exten => 2222,1,NoOp(Pseudo LANGUAGE is ${LANGUAGE})
exten => 2222,n,Set(CHANNEL(language)=fr)
exten => 2222,n,Set(NBR2CALL=0142928100)
;exten => 2222,n,SayNumber(${NBR2CALL})
exten => 2222,n,Playback(num:${NBR2CALL},say)
exten => 2222,n,Hangup
CLI:
-- Executing [2222@internal:1] NoOp("SIP/xlite-02b20004", "Pseudo LANGUAGE is ") in new stack
-- Executing [2222@internal:2] Set("SIP/xlite-02b20004", "CHANNEL(language)=fr") in new stack
-- Executing [2222@internal:3] Set("SIP/xlite-02b20004", "NBR2CALL=0142928100") in new stack
-- Executing [2222@internal:4] Playback("SIP/xlite-02b20004", "num:0142928100|say") in new stack
-- <SIP/xlite-02b20004> Playing 'digits/hundred' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/40' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/2' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/million' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/9' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/hundred' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/20' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/8' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/thousand' (language 'fr')
-- <SIP/xlite-02b20004> Playing 'digits/hundred' (language 'fr')
-- Executing [2222@internal:5] Hangup("SIP/xlite-02b20004", "") in new stack
== Spawn extension (internal, 2222, 5) exited non-zero on 'SIP/xlite-02b20004'
Soit "142 millions, 928 mille, cent".
littlebigman
10/03/2011, 13h21
Ça avance:
say.conf:
[fr](date-base,digit-base)
...
_pho[n]e:0[1-9]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}
extensions.conf
exten => 2222,n,Playback(phone:${NBR2CALL},say)
En revanche, le pattern ne fonctionne pas quand un couple commence par un zéro, par exemple 01 : Asterisk ne prononce pas le zéro. Comment faire?
Autre question plus générale: le [n] est mis entre crochet pour ne pas le confondre avec N (n'importe quel chiffre entre 2 et 9) parce qu'Asterisk n'est pas sensible à la casse?
Merci.
ffossard
10/03/2011, 14h55
Ça avance:
say.conf:
[fr](date-base,digit-base)
...
_pho[n]e:0[1-9]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}
extensions.conf
exten => 2222,n,Playback(phone:${NBR2CALL},say)
En revanche, le pattern ne fonctionne pas quand un couple commence par un zéro, par exemple 01 : Asterisk ne prononce pas le zéro. Comment faire?
Voilà vous avez compris :jap:
La lecture dans le "format" pho[n]e contient des morceaux comme celui-ci: num:${SAY:0:1}
Posez-vous la question: comment est lu le nombre "06" au format "num" ? :wink:
littlebigman
10/03/2011, 15h11
Trouvé : il faut modifier say.conf comme suit:
[fr](date-base,digit-base)
;BAD _[n]um:0. => num:${SAY:1}
_[n]um:0X => num:${SAY:0:1}, num:${SAY:1:1}
Si j'ai bien compris, le principe de say.conf est :
1. Playback(phone:0123456,say) cherche un préfixe qui s'appelle "phone" et dont le numéro correspond à un pattern:
_pho[n]e:0[1-9]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}
2. Ensuite, l'appli app_playback.so analyse la partie droite (ce qui suit =>) et vérifie s'il existe d'autres patterns dans say.conf qui pourraient encore modifier la lecture.
En l'occurence, la modification du pattern "_[n]um:0X" permet de lui faire lire un couple de chiffres commençant par un zéro en prononçant le zéro.
J'ai rajouté le support pour les numéros 800:
_pho[n]e:08XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:3},num:${SAY:4:2}, num:${SAY:6:2},num:${SAY:8:2}
Pour ceux que ça intéresse, plus de détails sur le plan de numérotation français (http://fr.wikipedia.org/wiki/Plan_de_num%C3%A9rotation_t%C3%A9l%C3%A9phonique_e n_France).
Si quelqu'un sait comment ajouter ces modifications afin qu'elles soient incluses dans les futures versions d'Asterisk afin d'éviter à d'autres de perdre leur temps...
Merci.
littlebigman
10/03/2011, 16h05
Bizarre : un numéro en 0800123456 est bien prononcé "zéro huit cent douze trente-quatre cinquante-six) alors que pour 0892123456, les chiffres sont prononcés indivuellement :-/
;say.conf
;unité
_[n]um:X => digits/${SAY}
;dizaine
_[n]um:1X => digits/${SAY}
_[n]um:[2-9]0 => digits/${SAY}
_[n]um:[2-6]1 => digits/${SAY:0:1}0, vm-and, digits/${SAY:1}
_[n]um:71 => digits/60, vm-and, num:1${SAY:1}
_[n]um:7X => digits/60, num:1${SAY:1}
_[n]um:9X => digits/80, num:1${SAY:1}
_[n]um:[2-9][1-9] => digits/${SAY:0:1}0, num:${SAY:1}
;centaine
_[n]um:100 => digits/hundred
_[n]um:1XX => digits/hundred, num:${SAY:1}
_[n]um:[2-9]00 => num:${SAY:0:1}, digits/hundred
_[n]um:[2-9]XX => num:${SAY:0:1}, digits/hundred, num:${SAY:1}
;0800XXXXXX -> 0899XXXXXX
;_pho[n]e:08XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:3}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}
;CLI
-- Executing [2222@internal:4] Playback("SIP/xlite-02a56004", "phone:0810009032|say") in new stack
-- <SIP/xlite-02a56004> Playing 'digits/0' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/8' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/hundred' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/10' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/0' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/0' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/90' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/30' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/2' (language 'fr')
-- Executing [2222@internal:6] Playback("SIP/xlite-02a56004", "phone:0892123456}|say") in new stack
-- <SIP/xlite-02a56004> Playing 'digits/0' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/8' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/9' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/2' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/1' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/2' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/3' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/4' (language 'fr')
-- <SIP/xlite-02a56004> Playing 'digits/5' (language 'fr')
-- Executing [2222@internal:7] Hangup("SIP/xlite-02a56004", "") in new stack
Je ne comprends pourquoi le pattern fonctionne pour un 0800 et pas pour un 092. Quelqu'un a une idée?
Merci.
littlebigman
10/03/2011, 17h16
Il y avait un } en trop dans le numéro:
-- Executing [2222@internal:6] Playback("SIP/xlite-02a56004", "phone:0892123456}|say") in new stack
ffossard
10/03/2011, 20h30
J'allais le dire ...
littlebigman
11/03/2011, 00h33
A force de faire des copier/coller et de chercher des pistes compliquées, on finit par se laisser piéger par ce genre de truc :-/
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. Tous droits réservés