PDA

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 :-/