tag:blogger.com,1999:blog-19394232776994589692024-03-12T18:35:10.519-07:00Asterisk Number to Voice ConfigurationsAshik Alihttp://www.blogger.com/profile/01385852945835839008noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-1939423277699458969.post-16765003674627805412010-05-05T02:03:00.000-07:002012-11-18T00:57:31.584-08:00Asterisk Number ,Date,Time to Speech Configuration<span style="font-size: 100%;"><span style="color: #009900;"><span class="Apple-style-span">This is documentation is useful for those who wanted to configur</span></span><span class="Apple-style-span"><span style="color: #009900;">e Date,Time,Number to speech in Asterisk .</span></span></span><br />
<br />
<span style="font-size: 100%;"><span class="Apple-style-span"><span style="color: #009900;"> </span><span style="font-weight: bold;">Introduction</span> :<br /><br />In order to configure number to speech in asterisk.We need to edit /etc/asterisk/say.conf file.By default there are number to speech configurations for English,German and Italy..etc languages.If you want to make asterisk to speak your language, we have to do some configurations on this.For example we can say, in say.conf file by default we are able to see the configuration settings for English as [en] and Italy as [it]. Here I attached sample text of say.conf for English.<br /><br />[digit-base](!) ; base rule for digit strings<br />_digit:[0-9] => digits/${SAY}<br />_digit:[-] => letters/dash<br />_digit:[*] => letters/star<br />_digit:[@] => letters/at<br />_digit:[0-9]. => digit:${SAY:0:1}, digit:${SAY:1}<br /><br />[date-base](!) ; base rules for dates and times<br />; the 'SAY' variable contains YYYYMMDDHHmm.ss-dow-doy<br />; these rule map the strftime attributes.<br />_date:Y:. => num:${SAY:0:4} ; year, 19xx<br />_date:[Bbh]:. => digits/mon-$[${SAY:4:2}-1] ; month name, 0..11<br />_date:[Aa]:. => digits/day-${SAY:16:1} ; day of week<br />_date:[de]:. => num:${SAY:6:2} ; day of month<br />_date:[H]:. => digits/oh, num:${SAY:8:2}<br />; hour (oh one, oh two, ..., oh nine, ten, eleven, ..., twenty-three)<br />_date:[I]:. => num:$[${SAY:8:2} % 12] ; hour 0-12<br />_date:[M]:. => num:${SAY:10:2} ; minute<br />; XXX too bad the '?' function does not remove the quotes<br />; _date:[pP]:. => digits/$[ ${SAY:10:2} > 12 ? "p-m" :: "a-m"] ; am pm<br />_date:[pP]:. => digits/p-m ; am pm<br />_date:[S]:. => num:${SAY:13:2} ; seconds<br />_date:[Ii]:. => num:$[${SAY:8:2} % 12] ; hour 0-12<br />_date:[k]:. => num:${SAY:8:2} ; hour (one, two. three, ...,twenty three<br />_date:[m]:. => num:${SAY:4:2} ; month number<br />_date:[Q]:. => date:dby ;incompleat ; "today", "yesterday" or ABdY<br />_date:[q]:. => date:dby ;incompleat ; "" (for today), "yesterday", weekday, or ABdY<br />_date:[R]:. => date:HM${SAY} ; 24 hour time, including minute<br />_date:[T]:. => date:HMS${SAY} ; 24 hour, minure, seconds<br />[en-base](!) ; this is a macro you have to find out exact [en] where this<br />; macro has been included.<br />_[n]um:0. => num:${SAY:1}<br />_[n]um:X => digits/${SAY}<br />_[n]um:1X => digits/${SAY}<br />_[n]um:[2-9]0 => digits/${SAY}<br />_[n]um:[2-9][1-9] => digits/${SAY:0:1}0, num:${SAY:1}<br />_[n]um:X00 => num:${SAY:0:1}, digits/hundred<br />_[n]um:XXX => num:${SAY:0:1}, digits/hundred, num:${SAY:1}<br /><br />_[n]um:N000 => num:${SAY:0:1}, digits/thousand</span></span><br />
<span style="font-size: 100%;"><span class="Apple-style-span">_[n]um:1XXX => digits/thousand,num:${SAY:1}<br />_[n]um:NXXX => num:${SAY:0:1}, digits/thousand, num:${SAY:1}<br />_[n]um:XX000 => num:${SAY:0:2}, digits/thousand<br />_[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2}<br />_[n]um:XXX000 => num:${SAY:0:3}, digits/thousand<br />_[n]um:XXXXXX => num:${SAY:0:3}, digits/thousand, num:${SAY:3}<br /><br />_[n]um:X000000 => num:${SAY:0:1}, digits/million<br />_[n]um:XXXXXXX => num:${SAY:0:1}, digits/million, num:${SAY:1}<br />_[n]um:XX000000 => num:${SAY:0:2}, digits/million<br />_[n]um:XXXXXXXX => num:${SAY:0:2}, digits/million, num:${SAY:2}<br />_[n]um:XXX000000 => num:${SAY:0:3}, digits/million<br />_[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/million, num:${SAY:3}<br /><br />_[n]um:X000000000 => num:${SAY:0:1}, digits/billion<br />_[n]um:XXXXXXXXXX => num:${SAY:0:1}, digits/billion, num:${SAY:1}<br />_[n]um:XX000000000 => num:${SAY:0:2}, digits/billion<br />_[n]um:XXXXXXXXXXX => num:${SAY:0:2}, digits/billion, num:${SAY:2}<br />_[n]um:XXX000000000 => num:${SAY:0:3}, digits/billion<br />_[n]um:XXXXXXXXXXXX => num:${SAY:0:3}, digits/billion, num:${SAY:3}<br /><br />[en](en-base,date-base,digit-base) ;here we have included macros .<br />_datetime::. => date:AdBY 'digits/at' IMp:${SAY}<br />_date::. => date:AdBY:${SAY}<br />_time::. => date:IMp:${SAY}<br /><br />Above all are implemented using asterisk pattern matching techniques . If you don't know about asterisk pattern matching please have look on<br /><br />http://www.automated.it/asterisk/lah-3-6-05_3.html<br />http://www.the-asterisk-book.com/unstable/einleitung-regex.html .<br /><br />let us play the number 25,376 using following example .<br /><br /><span style="font-weight: bold;">On Dialplan</span>:<br /><br />[sample]<br />exten = s,1,NoOp(PlayNumber)<br />exten = s,n,Set(CHANNEL(language)=en) ; by default it would be English only .<br />exten = s,n,Playback(num:25376|say);<br />exten = s,n,hangup<br /><br /> <span style="font-size: 85%; font-weight: bold;">Note</span>:<br /><br />If you are using asterisk-1.6 and above version; then replace ',' with '|' as <br /> p</span></span><span style="font-size: 100%;"><span class="Apple-style-span">layback(num:25376,say)</span></span><span style="font-size: 100%;"><span style="font-weight: bold;">Explanation:</span><br /><br />When the asterisk executes the playback(num:25376|say); it matches with say.conf for english(en) . As per the above configuration; so the hit should be on<br /><br />_[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2} line.<br /><br /><span style="color: #ff6600;"><br /></span><span style="color: #ff6600;"> <span style="color: black;"> <span style="font-size: 85%; font-weight: bold;">Note:</span></span></span></span><br />
<ol>
<li><span style="font-size: 100%;"><span style="color: black;">X means [0-9] so, [0-9][0-9][0-9][0-9] (four digit count)</span></span></li>
<li><span style="color: black;">Meaning of ${SAY:0:2} is 0 => Index postion, 2 => Count character to pickup.</span></li>
</ol>
<span style="font-size: 100%;"><br />We just match this with recursive functionality in programming.<br /><br />When the flow is on the above line, say variable has 25376. Then it start to execute num:${SAY:0:2} and it goes for pattern<br />matching with _[n]um:[2-9][1-9] => digits/${SAY:0:1}0, num:${SAY:1} using the number 25( ${SAY:0:2} ).<br />Now the say variable has 25.<br /><br />Now we hear twenty(20) using digits/${SAY:0:1}0.Then again it goes for the line<br />=> _[n]um:X => digits/${SAY} using num:${SAY:1}.Now the say variable has 5. Now we hear five(5).<br /><br />Right now, we are completed the first part of this line _[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2} . Then asterisk<br />play thousand( 1000 ).<br /><br />Now num:${SAY:2} has 376 it skips 25 thousands because it was played.Follow the above steps again for 376 to get three hundred<br />seventy six.<br /><br />which are the patterns have _[n]um; you just take it as recursive function.<br /><br />That's it.We are now familiar with asterisk say.conf.<br /><br /><span style="font-weight: bold;">Number,Date,Time to voice or speech configuration settings for Indian English :</span><br /><br />In indian english,there is a change in reading numbers.we used to read this number as 254560 "two lack fifty four thousand five hundred sixty".To achive this; here is the configuration for reading indian english numbers.Replace this in say.conf en-base context.<br /><br /><br />[en_IN](date-base,digit-base)<br /> _[n]um:0. => num:${SAY:1} ;just to skip the preceeding '0';<br /> _[n]um:X => digits/${SAY}<br /> _[n]um:1X => digits/${SAY}<br /> _[n]um:[2-9]0 => digits/${SAY}<br /> _[n]um:[2-9][1-9] => digits/${SAY:0:1}0,num:${SAY:1}<br /> _[n]um:X00 => num:${SAY:0:1}, digits/hundred<br /> _[n]um:XXX => num:${SAY:0:1}, digits/hundred,num:${SAY:1}<br /><br /> _[n]um:X000 => num:${SAY:0:1}, digits/thousand</span><br />
<span style="font-size: 100%;"><br /> _[n]um:XXXX => num:${SAY:0:1}, digits/thousand,num:${SAY:1}<br /> _[n]um:XX000 => num:${SAY:0:2}, digits/thousand<br /> _[n]um:XXXXX => num:${SAY:0:2}, digits/thousand,num:${SAY:2}<br /><br /> _[n]um:X00000 => num:${SAY:0:1},digits/lack<br /> _[n]um:XXXXXX => num:${SAY:0:1},digits/lack,num:${SAY:1}<br /> _[n]um:XX00000 => num:${SAY:0:2},digits/lack<br /> _[n]um:XXXXXXX => num:${SAY:0:2},digits/lack,num:${SAY:2}<br /><br /> _[n]um:X0000000 => num:${SAY:0:1},digits/crore<br /> _[n]um:XXXXXXXX => num:${SAY:0:1},digits/crore,num:${SAY:1}<br /> _[n]um:XX0000000 => num:${SAY:0:2},digits/crore<br /> _[n]um:XXXXXXXXX => num:${SAY:0:2},digits/crore,num:${SAY:2}<br /> _[n]um:XXX0000000 => num:${SAY:0:3},digits/crore<br /> _[n]um:XXXXXXXXXX => num:${SAY:0:3},digits/crore,num:${SAY:3}<br /> _[n]um:XXXX0000000 => num:${SAY:0:4},digits/crore<br /> _[n]um:XXXXXXXXXXX => num:${SAY:0:4},digits/crore,num:${SAY:4}<br /> _[n]um:XXXXX0000000 => num:${SAY:0:5},digits/crore<br /> _[n]um:XXXXXXXXXXXX => num:${SAY:0:5},digits/crore,num:${SAY:5}<br /> _[n]um:XXXXXX0000000 => num:${SAY:0:6},digits/crore<br /> _[n]um:XXXXXXXXXXXXX => num:${SAY:0:6},digits/crore,num:${SAY:6}<br /> _[n]um:XXXXXXX0000000 => num:${SAY:0:7},digits/crore<br /> _[n]um:XXXXXXXXXXXXXX => num:${SAY:0:7},digits/crore,num:${SAY:7}<br /><br /> _datetime::. => date:AdBY 'digits/at' IMp:${SAY}<br /> _date::. => date:AdBY:${SAY}<br /> _time::. => date:IMp:${SAY}<br /><span style="font-size: 85%;"><br /></span><span style="font-size: 85%; font-weight: bold;"> Note:</span></span><span style="font-size: 100%;"><br /> Record "lack,crore" or download from<br /> https://github.com/ashikali/Regional-Asterisk-Number-Date-Time-to-speech-settings and place</span><span style="font-size: 100%;"> it in /var/lib/asterisk/sounds/en/digits directory before going to apply above settings for india english number system.<br /><br /><span style="font-weight: bold;">Number,Date,Time to voice or speech configuration settings for Arabic </span>:<br /><br /><br />In Arabic number system quite different from english number system.There is a small changes in reading two digit numbers<br />such as 11,23,67..99. Remaining methodologies are same as english.<br /><br /><span style="font-size: 85%; font-weight: bold;">For example,</span><br /><br /> 34 => "orbaha va thalathun" just reverse interpretation in english. Instead of "thirty four", "four thirty" that is it.<br /><br />1534 => "Alf va hamsa miya va orbha va thalthun"<br /><br />[ar](date-base,digit-base)<br /> _[n]um:0. => num:${SAY:1} ;just skip the preceeding '0' 000 results 0 this 0 will hit again<br /> ;coz . means it should have some digits on that.<br /> _[n]um:X => digits/${SAY}<br /> _[n]um:1[1-9] => digits/${SAY} ;z 1-9 so 10,20,30 ..90<br /> _[n]um:Z0 => digits/${SAY} ;z 1-9 so 10,20,30 ..90<br /> _[n]um:[2-9][1-9] => digits/${SAY:1},digits/and,digits/${SAY:0:1}0<br /> _[n]um:[1-2]00 => digits/${SAY} ;100,200 voice should be<br /> _[n]um:[3-9]00 => digits/${SAY:0:1},digits/100<br /> _[n]um:[1-2]XX => digits/${SAY:0:1}00,digits/and,num:${SAY:1}<br /> _[n]um:[3-9]XX => digits/${SAY:0:1},digits/100,digits/and,num:${SAY:1}<br /><br /> _[n]um:[1-2]000 => digits/${SAY} ;1000,2000 voice should be<br /> _[n]um:[3-9]000 => digits/${SAY:0:1}, digits/1000<br /> _[n]um:[1-2]XXX => digits/${SAY:0:1}000,digits/and,num:${SAY:1}<br /> _[n]um:[3-9]XXX => digits/${SAY:0:1},digits/1000,digits/and,num:${SAY:1}<br /> _[n]um:XX000 => num:${SAY:0:2},digits/1000<br /> _[n]um:XXXXX => num:${SAY:0:2},digits/1000,digits/and,num:${SAY:2} ;${say:index:count}<br /> _[n]um:XXX000 => num:${SAY:0:3},digits/1000<br /> _[n]um:XXXXXX => num:${SAY:0:3},digits/1000,digits/and,num:${SAY:3}<br /><br /> _[n]um:1000000 => digits/million<br /> _[n]um:X000000 => digits/${SAY:0:1}, digits/million<br /> _[n]um:1XXXXXX => digits/million,digits/and,num:${SAY:1}<br /> _[n]um:XXXXXXX => digits/${SAY:0:1}, digits/million,digits/and,num:${SAY:1}<br /> _[n]um:XX000000 => num:${SAY:0:2},digits/million<br /> _[n]um:XXXXXXXX => num:${SAY:0:2}, digits/million,digits/and,num:${SAY:2}<br /> _[n]um:XXX000000 => num:${SAY:0:3}, digits/million<br /> _[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/million,digits/and,num:${SAY:3}<br /><br /> _[n]um:1000000000 => digits/billion<br /> _[n]um:X000000000 => digits/${SAY:0:1}, digits/billion<br /> _[n]um:1XXXXXXXXX => digits/billion,digits/and,num:${SAY:1}<br /> _[n]um:XXXXXXXXXX => digits/${SAY:0:1}, digits/billion,digits/and,num:${SAY:1}<br /> _[n]um:XX000000000 => num:${SAY:0:2}, digits/billion<br /> _[n]um:XXXXXXXXXXX => num:${SAY:0:2}, digits/billion,digits/and, num:${SAY:2}<br /> _[n]um:XXX000000000 => num:${SAY:0:3}, digits/billion<br /> _[n]um:XXXXXXXXXXXX => num:${SAY:0:3}, digits/billion,digits/and, num:${SAY:3}<br /><br /> _datetime::. => date:AdBY 'digits/at' IMp:${SAY}<br /> _date::. => date:AdBY:${SAY}<br /> _time::. => date:IMp:${SAY}<br /><br /><br /><span style="font-weight: bold;"> Note</span><span style="font-weight: bold;">:</span></span><br />
<ol>
<li><span style="font-size: 100%;">Above settings will be useful for those who have limited voices rather than 0..99.</span></li>
<li><span style="font-size: 100%;"> You can download arabic voice files from https://github.com/ashikali/Regional-Asterisk-Number-Date-Time-to-speech-settings. it does not contain 0..99,date and time voice files. Just it has to cover number part for above settings.</span></li>
</ol>
<span style="font-size: 100%;"><span style="font-weight: bold;">How to Workout</span>:<br /><br />To make it effect in asterisk just run the following command in asterisk console.<br /><br />*CLI> module reload app_playback.so<br /><br /> or<br /><br />*CLI> reload<br /><br /><br /> <span style="font-weight: bold;">On Dialplan</span>:<br /><br /><br />[sample]<br />exten => s,1,NoOp(PlayNumber)<br />exten => s,n,Set(CHANNEL(language)=en) ; by default it would be english only .<br />exten => s,n,Playback(num:25376|say); ; for number<br />exten => s,n,playback(datetime::201104172030.00-4-102,say) ; for date<br />exten => s,n,hangup<br /><br /> <span style="font-weight: bold;">Note</span>:<br /><br /> If you are using asterisk-1.6 and above version; then replace ',' with '|' as playback(num:25376,say)<br /><br /> <span style="font-weight: bold;">On AGI</span>:<br /><br />I don't know whether it is bug or not.For both 1.4 and 1.6; we have to use '|' although it is 1.6.<br /><br /><span style="font-weight: bold;">On 1.8 and above</span>:<br /><br /> #!/usr/bin/perl -w<br /><br /> use Asterisk::AGI;<br /><br /> my $AGI = new Asterisk::AGI,$result;<br /> #for number<br /> $AGI->exec("PLAYBACK num:2415312511,say \"\"\n");<br /> #for date<br /> $AGI->exec("PLAYBACK datetime::201104172030.00-4-102,say \"\"\n"); # for date<br /> exit;<br /><br /> <span style="font-weight: bold;">On 1.4 and 1.6</span> :<br /><br /> #!/usr/bin/perl -w<br /><br /> use Asterisk::AGI;<br /><br /> my $AGI = new Asterisk::AGI,$result;<br /> #for number<br /> $AGI->exec("PLAYBACK num:2415312511|say \"\"\n");<br /> # for date<br /> $AGI->exec("PLAYBACK datetime::201104172030.00-4-102|say \"\"\n");<br /> exit;<br /><br />Enjoy with playing asterisk ,<br /><br />Please comment on this; If you think that anything wrong in above .<br /><br /><br />Cheers,<br />Ashik Ali<br />ashikali.m@gmail.com<br /></span><span style="font-size: 100%;"><span class="Apple-style-span"><br /></span></span><span style="font-size: 100%;"><span class="Apple-style-span"></span><br /> </span>Ashik Alihttp://www.blogger.com/profile/01385852945835839008noreply@blogger.com1