dect
/
asterisk
Archived
13
0
Fork 0

Add SayPhonetic and SayAlpha applications (bug #793)

git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2864 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
markster 2004-05-03 00:54:16 +00:00
parent 75a0cc8b77
commit ddca191dd3
71 changed files with 527 additions and 4 deletions

View File

@ -273,6 +273,24 @@ datafiles: all
exit 1; \
fi; \
done
mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters
for x in sounds/letters/*.gsm; do \
if grep -q "^%`basename $$x`%" sounds.txt; then \
install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/letters ; \
else \
echo "No description for $$x"; \
exit 1; \
fi; \
done
mkdir -p $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic
for x in sounds/phonetic/*.gsm; do \
if grep -q "^%`basename $$x`%" sounds.txt; then \
install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds/phonetic ; \
else \
echo "No description for $$x"; \
exit 1; \
fi; \
done
for x in sounds/vm-* sounds/transfer* sounds/pbx-* sounds/ss-* sounds/beep* sounds/dir-* sounds/conf-* sounds/agent-* sounds/invalid* sounds/tt-* sounds/auth-* sounds/privacy-* sounds/queue-*; do \
if grep -q "^%`basename $$x`%" sounds.txt; then \
install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \

View File

@ -385,10 +385,12 @@ static int handle_saydigits(struct ast_channel *chan, AGI *agi, int argc, char *
{
int res;
int num;
if (argc != 4)
return RESULT_SHOWUSAGE;
if (sscanf(argv[2], "%i", &num) != 1)
return RESULT_SHOWUSAGE;
res = ast_say_digit_str_full(chan, argv[2], argv[3], chan->language, agi->audio, agi->ctrl);
if (res == 1) /* New command */
return RESULT_SUCCESS;
@ -417,6 +419,23 @@ static int handle_saytime(struct ast_channel *chan, AGI *agi, int argc, char *ar
return RESULT_FAILURE;
}
static int handle_sayphonetic(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
{
int res;
if (argc != 4)
return RESULT_SHOWUSAGE;
res = ast_say_phonetic_str_full(chan, argv[2], argv[3], chan->language, agi->audio, agi->ctrl);
if (res == 1) /* New command */
return RESULT_SUCCESS;
fdprintf(agi->fd, "200 result=%d\n", res);
if (res >= 0)
return RESULT_SUCCESS;
else
return RESULT_FAILURE;
}
static int handle_getdata(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
{
int res;
@ -1031,6 +1050,13 @@ static char usage_saytime[] =
" completes without a digit being pressed, or the ASCII numerical value of the\n"
" digit if one was pressed or -1 on error/hangup.\n";
static char usage_sayphonetic[] =
" Usage: SAY PHONETIC <string> <escape digits>\n"
" Say a given character string with phonetics, returning early if any of the given DTMF digits\n"
" are received on the channel. Returns 0 if playback completes without a digit\n"
" being pressed, or the ASCII numerical value of the digit if one was pressed or\n"
" -1 on error/hangup.\n";
static char usage_getdata[] =
" Usage: GET DATA <file to be streamed> [timeout] [max digits]\n"
" Stream the given file, and recieve DTMF data. Returns the digits recieved\n"
@ -1080,6 +1106,7 @@ static agi_command commands[] = {
{ { "send", "image", NULL }, handle_sendimage, "Sends images to channels supporting it", usage_sendimage },
{ { "say", "digits", NULL }, handle_saydigits, "Says a given digit string", usage_saydigits },
{ { "say", "number", NULL }, handle_saynumber, "Says a given number", usage_saynumber },
{ { "say", "phonetic", NULL }, handle_sayphonetic, "Says a given character string with phonetics", usage_sayphonetic },
{ { "say", "time", NULL }, handle_saytime, "Says a given time", usage_saytime },
{ { "get", "data", NULL }, handle_getdata, "Gets data on a channel", usage_getdata },
{ { "set", "context", NULL }, handle_setcontext, "Sets channel context", usage_setcontext },

View File

@ -896,7 +896,6 @@ static char *cli_prompt(EditLine *el)
int i;
struct timeval tv;
struct tm tm;
time_t curtime;
FILE *LOADAVG;
int fgcolor = COLOR_WHITE, bgcolor = COLOR_BLACK;

View File

@ -29,6 +29,11 @@ console => notice,warning,error
;console => notice,warning,error,debug
messages => notice,warning,error
;full => notice,warning,error,debug,verbose
;
; Uncomment the following line (with *no* events) if you want the
; queue log to automatically rotate.
;
;queue_log =>
;syslog keyword : This special keyword logs to syslog facility
;

View File

@ -61,6 +61,10 @@ int ast_say_digits_full(struct ast_channel *chan, int num, char *ints, char *lan
*/
int ast_say_digit_str(struct ast_channel *chan, char *num, char *ints, char *lang);
int ast_say_digit_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
int ast_say_character_str(struct ast_channel *chan, char *num, char *ints, char *lang);
int ast_say_character_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
int ast_say_phonetic_str(struct ast_channel *chan, char *num, char *ints, char *lang);
int ast_say_phonetic_str_full(struct ast_channel *chan, char *num, char *ints, char *lang, int audiofd, int ctrlfd);
int ast_say_datetime(struct ast_channel *chan, time_t t, char *ints, char *lang);

26
pbx.c
View File

@ -169,6 +169,8 @@ static int pbx_builtin_gotoif(struct ast_channel *, void *);
static int pbx_builtin_gotoiftime(struct ast_channel *, void *);
static int pbx_builtin_saynumber(struct ast_channel *, void *);
static int pbx_builtin_saydigits(struct ast_channel *, void *);
static int pbx_builtin_saycharacters(struct ast_channel *, void *);
static int pbx_builtin_sayphonetic(struct ast_channel *, void *);
int pbx_builtin_setvar(struct ast_channel *, void *);
void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
@ -293,6 +295,14 @@ static struct pbx_builtin {
"Say Digits",
" SayDigits(digits): Says the passed digits\n" },
{ "SayAlpha", pbx_builtin_saycharacters,
"Say Alpha",
" SayAlpha(string): Spells the passed string\n" },
{ "SayPhonetic", pbx_builtin_sayphonetic,
"Say Phonetic",
" SayPhonetic(string): Spells the passed string with phonetic alphabet\n" },
{ "SetAccount", pbx_builtin_setaccount,
"Sets account code",
" SetAccount([account]): Set the channel account code for billing\n"
@ -4601,6 +4611,22 @@ static int pbx_builtin_saydigits(struct ast_channel *chan, void *data)
return res;
}
static int pbx_builtin_saycharacters(struct ast_channel *chan, void *data)
{
int res = 0;
if (data)
res = ast_say_character_str(chan, (char *)data, "", chan->language);
return res;
}
static int pbx_builtin_sayphonetic(struct ast_channel *chan, void *data)
{
int res = 0;
if (data)
res = ast_say_phonetic_str(chan, (char *)data, "", chan->language);
return res;
}
int load_pbx(void)
{
int x;

314
say.c
View File

@ -16,6 +16,7 @@
#include <stdlib.h>
#include <netinet/in.h>
#include <time.h>
#include <ctype.h>
#include <asterisk/file.h>
#include <asterisk/channel.h>
#include <asterisk/logger.h>
@ -45,15 +46,187 @@ int ast_say_digit_str(struct ast_channel *chan, char *fn2, char *ints, char *lan
snprintf(fn, sizeof(fn), "digits/pound");
break;
default:
if((fn2[num] >= '0') && (fn2[num] <= '9')){ /* Must be in {0-9} */
if((fn2[num] >= '0') && (fn2[num] <= '9')){ /* Must be in {0-9} */
snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
}
}
}
if(strlen(fn)){ /* if length == 0, then skip this digit as it is invalid */
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream(chan, ints);
ast_stopstream(chan);
}
num++;
}
return res;
}
int ast_say_character_str(struct ast_channel *chan, char *fn2, char *ints, char *lang)
{
/* XXX Merge with full version? XXX */
char fn[256] = "";
char ltr;
int num = 0;
int res = 0;
while(fn2[num] && !res) {
fn[0] = '\0';
switch (fn2[num]) {
case ('*'):
snprintf(fn, sizeof(fn), "digits/star");
break;
case ('#'):
snprintf(fn, sizeof(fn), "digits/pound");
break;
case ('0'):
case ('1'):
case ('2'):
case ('3'):
case ('4'):
case ('5'):
case ('6'):
case ('7'):
case ('8'):
case ('9'):
snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
break;
case ('!'):
strncpy(fn, "letters/exclaimation-point", sizeof(fn));
break;
case ('@'):
strncpy(fn, "letters/at", sizeof(fn));
break;
case ('$'):
strncpy(fn, "letters/dollar", sizeof(fn));
break;
case ('-'):
strncpy(fn, "letters/dash", sizeof(fn));
break;
case ('.'):
strncpy(fn, "letters/dot", sizeof(fn));
break;
case ('='):
strncpy(fn, "letters/equals", sizeof(fn));
break;
case ('+'):
strncpy(fn, "letters/plus", sizeof(fn));
break;
case ('/'):
strncpy(fn, "letters/slash", sizeof(fn));
break;
case (' '):
strncpy(fn, "letters/space", sizeof(fn));
break;
default:
ltr = fn2[num];
if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
snprintf(fn, sizeof(fn), "letters/%c", ltr);
}
if(strlen(fn)){ /* if length == 0, then skip this digit as it is invalid */
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream(chan, ints);
ast_stopstream(chan);
} ast_stopstream(chan);
num++;
}
return res;
}
int ast_say_phonetic_str(struct ast_channel *chan, char *fn2, char *ints, char *lang)
{
/* XXX Merge with full version? XXX */
char fn[256] = "";
char ltr;
int num = 0;
int res = 0;
int temp;
int play;
char hex[3];
/* while(fn2[num] && !res) { */
while(fn2[num]) {
play=1;
switch (fn2[num]) {
case ('*'):
snprintf(fn, sizeof(fn), "digits/star");
break;
case ('#'):
snprintf(fn, sizeof(fn), "digits/pound");
break;
case ('0'):
case ('1'):
case ('2'):
case ('3'):
case ('4'):
case ('5'):
case ('6'):
case ('7'):
case ('8'):
snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
break;
case ('!'):
strncpy(fn, "exclaimation-point", sizeof(fn));
break;
case ('@'):
strncpy(fn, "at", sizeof(fn));
break;
case ('$'):
strncpy(fn, "dollar", sizeof(fn));
break;
case ('-'):
strncpy(fn, "dash", sizeof(fn));
break;
case ('.'):
strncpy(fn, "dot", sizeof(fn));
break;
case ('='):
strncpy(fn, "equals", sizeof(fn));
break;
case ('+'):
strncpy(fn, "plus", sizeof(fn));
break;
case ('/'):
strncpy(fn, "slash", sizeof(fn));
break;
case (' '):
strncpy(fn, "space", sizeof(fn));
break;
case ('%'):
play=0;
/* check if we have 2 chars after the % */
if (strlen(fn2)>num+2)
{
hex[0]=fn2[num+1];
hex[1]=fn2[num+2];
hex[2]='\0';
if (sscanf(hex,"%x", &temp))
{ /* Hex to char convertion successfull */
fn2[num+2]=temp;
num++;
if (temp==37)
{ /* If it is a percent, play it now */
strncpy(fn, "percent", sizeof(fn));
num++;
play=1;
}
/* check for invalid characters */
if ((temp<32) || (temp>126))
{
num++;
}
}
}
else
num++;
break;
default: /* '9' falls through to here, too */
ltr = tolower(fn2[num]);
snprintf(fn, sizeof(fn), "phonetic/%c_p", ltr);
}
if (play)
{
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream(chan, ints);
ast_stopstream(chan);
}
num++;
}
@ -76,6 +249,141 @@ int ast_say_digit_str_full(struct ast_channel *chan, char *fn2, char *ints, char
return res;
}
int ast_say_character_str_full(struct ast_channel *chan, char *fn2, char *ints, char *lang, int audiofd, int ctrlfd)
{
char fn[256] = "";
char ltr;
int num = 0;
int res = 0;
while(fn2[num] && !res) {
switch (fn2[num]) {
case ('*'):
snprintf(fn, sizeof(fn), "digits/star");
break;
case ('#'):
snprintf(fn, sizeof(fn), "digits/pound");
break;
case ('0'):
case ('1'):
case ('2'):
case ('3'):
case ('4'):
case ('5'):
case ('6'):
case ('7'):
case ('8'):
case ('9'):
snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
break;
case ('!'):
strncpy(fn, "exclaimation-point", sizeof(fn));
break;
case ('@'):
strncpy(fn, "at", sizeof(fn));
break;
case ('$'):
strncpy(fn, "dollar", sizeof(fn));
break;
case ('-'):
strncpy(fn, "dash", sizeof(fn));
break;
case ('.'):
strncpy(fn, "dot", sizeof(fn));
break;
case ('='):
strncpy(fn, "equals", sizeof(fn));
break;
case ('+'):
strncpy(fn, "plus", sizeof(fn));
break;
case ('/'):
strncpy(fn, "slash", sizeof(fn));
break;
case (' '):
strncpy(fn, "space", sizeof(fn));
break;
default:
ltr = fn2[num];
if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
snprintf(fn, sizeof(fn), "letters/%c", ltr);
}
/* snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); */
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
ast_stopstream(chan);
num++;
}
return res;
}
int ast_say_phonetic_str_full(struct ast_channel *chan, char *fn2, char *ints, char *lang, int audiofd, int ctrlfd)
{
char fn[256] = "";
char ltr;
int num = 0;
int res = 0;
while(fn2[num] && !res) {
switch (fn2[num]) {
case ('*'):
snprintf(fn, sizeof(fn), "digits/star");
break;
case ('#'):
snprintf(fn, sizeof(fn), "digits/pound");
break;
case ('0'):
case ('1'):
case ('2'):
case ('3'):
case ('4'):
case ('5'):
case ('6'):
case ('7'):
case ('8'):
snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
break;
case ('!'):
strncpy(fn, "exclaimation-point", sizeof(fn));
break;
case ('@'):
strncpy(fn, "at", sizeof(fn));
break;
case ('$'):
strncpy(fn, "dollar", sizeof(fn));
break;
case ('-'):
strncpy(fn, "dash", sizeof(fn));
break;
case ('.'):
strncpy(fn, "dot", sizeof(fn));
break;
case ('='):
strncpy(fn, "equals", sizeof(fn));
break;
case ('+'):
strncpy(fn, "plus", sizeof(fn));
break;
case ('/'):
strncpy(fn, "slash", sizeof(fn));
break;
case (' '):
strncpy(fn, "space", sizeof(fn));
break;
default: /* '9' falls here... */
ltr = fn2[num];
if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
snprintf(fn, sizeof(fn), "phonetic/%c", ltr);
}
/* snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); */
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
ast_stopstream(chan);
num++;
}
return res;
}
int ast_say_digits(struct ast_channel *chan, int num, char *ints, char *lang)
{
/* XXX Should I be merged with say_digits_full XXX */

View File

@ -478,3 +478,137 @@
%vm-reachoper.gsm%press 0 to reach an operator
%vm-tooshort.gsm%your message is too short
%9_p.gsm%niner
%a.gsm%a
%b.gsm%b
%c.gsm%c
%d.gsm%d
%e.gsm%e
%f.gsm%f
%g.gsm%g
%h.gsm%h
%i.gsm%i
%j.gsm%j
%k.gsm%k
%l.gsm%l
%m.gsm%m
%n.gsm%n
%o.gsm%o
%p.gsm%p
%q.gsm%q
%r.gsm%r
%s.gsm%s
%t.gsm%t
%u.gsm%u
%v.gsm%v
%w.gsm%w
%x.gsm%x
%y.gsm%y
%z.gsm%z
%zed.gsm%zed
%a_p.gsm%alpha
%b_p.gsm%bravo
%c_p.gsm%charlie
%d_p.gsm%delta
%e_p.gsm%echo
%f_p.gsm%foxtrot
%g_p.gsm%golf
%h_p.gsm%hotel
%i_p.gsm%india
%j_p.gsm%juliet
%k_p.gsm%kilo
%l_p.gsm%lima
%m_p.gsm%mike
%n_p.gsm%november
%o_p.gsm%oscar
%p_p.gsm%papa
%q_p.gsm%quebec
%r_p.gsm%romeo
%s_p.gsm%sierra
%t_p.gsm%tango
%u_p.gsm%uniform
%v_p.gsm%victor
%w_p.gsm%wiskey
%x_p.gsm%xray
%y_p.gsm%yankee
%z_p.gsm%zulu
%niner.gsm%niner
; Misc
%percent.gsm%percent [%]
%plus.gsm%plus [+]
%exclaimation-point.gsm%exclaimation-point [!]
%at.gsm%at [@]
%dollar.gsm%dollar [$]
%dash.gsm%dash [-]
%dot.gsm%dot [.]
%slash.gsm%slash [/]
%space.gsm%space [ ]
%plus.gsm%plus [+]
%equals.gsm%equals [=]

BIN
sounds/letters/a.gsm Executable file

Binary file not shown.

BIN
sounds/letters/at.gsm Executable file

Binary file not shown.

BIN
sounds/letters/b.gsm Executable file

Binary file not shown.

BIN
sounds/letters/c.gsm Executable file

Binary file not shown.

BIN
sounds/letters/d.gsm Executable file

Binary file not shown.

BIN
sounds/letters/dash.gsm Executable file

Binary file not shown.

BIN
sounds/letters/dollar.gsm Executable file

Binary file not shown.

BIN
sounds/letters/dot.gsm Executable file

Binary file not shown.

BIN
sounds/letters/e.gsm Executable file

Binary file not shown.

BIN
sounds/letters/equals.gsm Executable file

Binary file not shown.

Binary file not shown.

BIN
sounds/letters/f.gsm Executable file

Binary file not shown.

BIN
sounds/letters/g.gsm Executable file

Binary file not shown.

BIN
sounds/letters/h.gsm Executable file

Binary file not shown.

BIN
sounds/letters/i.gsm Executable file

Binary file not shown.

BIN
sounds/letters/j.gsm Executable file

Binary file not shown.

BIN
sounds/letters/k.gsm Executable file

Binary file not shown.

BIN
sounds/letters/l.gsm Executable file

Binary file not shown.

BIN
sounds/letters/m.gsm Executable file

Binary file not shown.

BIN
sounds/letters/n.gsm Executable file

Binary file not shown.

BIN
sounds/letters/o.gsm Executable file

Binary file not shown.

BIN
sounds/letters/p.gsm Executable file

Binary file not shown.

BIN
sounds/letters/plus.gsm Executable file

Binary file not shown.

BIN
sounds/letters/q.gsm Executable file

Binary file not shown.

BIN
sounds/letters/r.gsm Executable file

Binary file not shown.

BIN
sounds/letters/s.gsm Executable file

Binary file not shown.

BIN
sounds/letters/slash.gsm Executable file

Binary file not shown.

BIN
sounds/letters/space.gsm Executable file

Binary file not shown.

BIN
sounds/letters/t.gsm Executable file

Binary file not shown.

BIN
sounds/letters/u.gsm Executable file

Binary file not shown.

BIN
sounds/letters/v.gsm Executable file

Binary file not shown.

BIN
sounds/letters/w.gsm Executable file

Binary file not shown.

BIN
sounds/letters/x.gsm Executable file

Binary file not shown.

BIN
sounds/letters/y.gsm Executable file

Binary file not shown.

BIN
sounds/letters/z.gsm Executable file

Binary file not shown.

BIN
sounds/letters/zed.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/9_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/a_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/b_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/c_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/d_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/e_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/f_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/g_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/h_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/i_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/j_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/k_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/l_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/m_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/n_p.gsm Executable file

Binary file not shown.

2
sounds/phonetic/o_p.gsm Executable file
View File

@ -0,0 +1,2 @@
Ô÷ƒsP VìµéeUñÉ$dyeVѹ[#[#P²JäBÉ#Ôx\zIâ®ØãØܘÌFÐËVëäŠT<C5A0>çÖóç 6rÕÛÔ·j©ÐçI"³v.Õ›*¤{u¬£ÆL3:I“<49>j1]–ÙÔ7Z¥IŸ¦dÛkˆÓQF‡¤¶ºÕñEÖz—ñ:ï»#Ô¶<,ƒ¡§H1Š˜êQ<12>=ÎÜ¡#!<21>]iñ²Ý^[TÓóCá
ñC€ìò¼¡£fÏ‘ÇQDùîZ£¡À-=ÊÛÓ±KeCñd±îY#£D”¹ÒL«QæÊ3YISD0;¾K%Ó­RiÂSe¦5¬ÚSÂ2„«²pSd˜ÓÙ\¥f¶Ð¹æäÓ*j^™U(8¢]JÞSFÇ©[¦ÅÔ¨ ó¬Væt&OÓæjÖ™¨Ç<C2A8>KŒ¥ÜXÅÕ±QW^äNufF)ºÃ»Öµdâ×çI ½öÚ<C3B6>»'S馄V‡.Dë¬Âqy©S0Øê¥ ÛÖB‰Sáœâ"sµ¾ÐàÂèãî÷»n³zîÙ¯¤ÕJªâ(M“N³Z´i>*dƒÂIŠS`qD Ø1é]ØîÅ™h㎣V[}®Æ<1F>/͹q&_iG24bÆ×qJ¼×²Íae6"Âã>1¤“°A£ ˜A¹6²ÝþÖëa…ÚÜo·ºÙ,ì@|=.“lÚ@²êm²âä@HéfBÛÕ¢QÐÙ¸ J܉ÀbÆàZãQÉ%„ I3<å¸@7cn&Üس<C398>ÖÕÛåÈãm·qèÆ}4¥h†I<E280A0>rÆ#¸$𤌢š×©b†îE'ÍæBµ£r.d¯Âç<C382>y£kzÄ´·þËÔ ]—ÒYj"Ö)$PÈ6×2·»¨§ÆÛHŸ[E! hþsÔ¢U<C2A2>Y·Ixc-Ÿd]¥dmB×]'¸ßqTŠ¹.<2E>9+ÔäEa¿(¥8uêžcHFLÐôùÇ& …)¹Ôƨ¹[éÂœÔçE È‡õb•NÓgz­º£ÎǦ™oÉmh)"<22>¶úÕ(Ké©kdFµSÄàkÅ„lÒG"o'¸âMf»mÄúo2òÕª:eêl£½ âþLmG5×2IÛDpcs\¥ÚĮ۩4PÔç4¥aÜÆxëqÇ"Ý#Åhr¸œàƒÙcm*5bÂÈnSåÖ,àèåD¼±¹+yCXÒJÖwB6©v<C2A9>Òxå3z±HäÖk:¥àvÃØM íñc©TÒQñ$D:ñ®­ ¤Î¯Ö«B!©šÂªÛ¾ñCk”ózÈ(4´<>ƒb­×2NÚðÄ&¼’-xáÖ؈Yð<> k¯Çð¢6œ£·×q3M©€ÂFÓ‰Dü~Á¥“T|¡%<12>º«ðá7Ùm4ž×´KiîÀ©'^£ÈØ<C388>5%rWœnÁ(ÂQ:¤Ø ¸BR×µsPêÎ@ÊÞrÉ#ð`ePl· Ð@$ã+ v@'¢<>¶Û

BIN
sounds/phonetic/p_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/q_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/r_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/s_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/t_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/u_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/v_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/w_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/x_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/y_p.gsm Executable file

Binary file not shown.

BIN
sounds/phonetic/z_p.gsm Executable file

Binary file not shown.