Add SayPhonetic and SayAlpha applications (bug #793)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2864 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2004-05-03 00:54:16 +00:00
parent 09eeb42315
commit 73b389da6c
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 @@
<EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>P V<><56><EFBFBD>eU<65><55>$dyeVѹ[#[#P<>J<EFBFBD>B<EFBFBD>#<23>x\zI<7A><49><EFBFBD><EFBFBD><11>ܘ<EFBFBD>F<EFBFBD><46>V<EFBFBD><56><EFBFBD>T<EFBFBD><54><EFBFBD><EFBFBD><EFBFBD> 6r<><72>Էj<D4B7><6A><EFBFBD>I"<22>v.՛*<2A>{u<><75><EFBFBD><EFBFBD>L3:I<><49>j1]<5D><><1A>7Z<37>I<EFBFBD><49>d<EFBFBD>k<EFBFBD><6B>QF<51><46><EFBFBD><EFBFBD><EFBFBD><EFBFBD>E<03>z<1C><>:<3A><>#Զ<,<2C><><EFBFBD>H1<48><31><EFBFBD>Q<12>=<3D>ܡ#!<21>]i<13><03><>^[T<><54>C<EFBFBD>
<EFBFBD>C<EFBFBD><EFBFBD>򼡣fϑ<>QD<51><44><EFBFBD>Z<EFBFBD><5A><04>-=<3D><>ӱKeC<65>d<EFBFBD><64><EFBFBD>Y#<23>D<EFBFBD><44><EFBFBD>L<EFBFBD>Q<EFBFBD><51>3YISD0;<3B>K%ӭRi<52>Se<53>5<EFBFBD><35><EFBFBD>S<EFBFBD>2<EFBFBD><32><EFBFBD>pSd<><64><EFBFBD>\<5C>f<EFBFBD>й<EFBFBD><D0B9><EFBFBD>*j^<5E>U(8<>]J<>SF<53><12>[<5B><>Ԩ

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.