BBS水木清华站∶精华区
发信人: wxb1 (ben), 信区: Linux
标 题: [4/8] 语音、传真、EMAIL的整合
发信站: BBS 水木清华站 (Fri Jun 11 14:17:10 1999)
以Linux实作 语音/传真/EMAIL/BBC 整合系统
4.语音、传真、EMAIL的整合
Linux系统要建立具有语音、传真及EMAIL的各项服务功能,并不困难,
但若都各自独立无法互通,那对讯息的利用,就显得颇为狭隘,无法因时至宜选
择最适合的方式传送或接收讯息,以下即承接先前两篇语音及传真的作法,探讨
语音与EMAIL的互转,及传真与EMAIL的互通。
语音至EMAIL
语音至EMAIL是指在系统中的留言,可根据使用者当初的设定,决定是
否要送出一EMAIL通知他,此EMAIL会将留言转成WAVE档案,以UUENCODE的方式附
加在电子邮递中,使用者收到此信的同时,也可听取对方的语音留言。
留言档案PCM格式转成WAVE格式的档案,可以用一工具程式"sox"来做转换,在此
处用法为:
sox -r 7200 -b -u voice.pcm voice.wav
其中 -r 7200 是指PCM Raw Data的取样频率为7200次/每秒,-b 是指每次取样
是以一个位元组(byte)表示,且为无正负号的表示(-u : unsigned ), 输
入的档案为 voice.pcm,转换後输出的档案为 voice.wav。发出EMAIL是用
sendmail,
完整的语音至电子邮递副程式如下:
Voc2Mail()
{
# 先读取该使用者的设定
read userReg < ${MAINPATH}conf/$1.reg
# 由第五栏位得知USER的EMAIL
email=`echo $userReg | cut -d"," -f5,5 -s`
# 由第十一栏位得知是否要发送EMAIL
to_email=`echo $userReg | cut -d"," -f11,11 -s`
if [ '$to_email' != '0' ]; then
if [ $email ]; then
# 先将EMAIL的标头及内容写入一暂存档,再由sendmail寄出
$ECHO "From: fax@ns.fancy.com.tw (VOICE to EMAIL)" > ${1}mailv.
txt
$ECHO "Subject: 有您的语音讯息" >> ${1}mailv.txt
# 加入 LF 作为标头与内容的分野
$ECHO "" >> ${1}mailv.txt
# PCM a WAVE
$SOX -r 7200 -b -u ${MAINPATH}voc/${2}.raw /tmp/${1}voc.wav
# 以UUENCODE编码後加入暂存档
$UUENCODE ${1}_voc.wav < /tmp/${1}voc.wav >> ${1}mailv.txt
# sendmail 送出EMAIL
/usr/sbin/sendmail $email < ${1}mailv.txt
# 删除暂存档及已送出的WAVE档
$RM -f ${1}mailv.txt
$RM -f /tmp/${1}voc.wav
fi
fi
}
除了将以上副程式加入外,在先前论及"语音数据机录/放音"的程式范例中,尚
未填入的"------- Voice a EMAIL -----"段落中,也需加入以下的呼叫:
Voc2Mail $UserID $filename
传真至EMAIL
传真至EMAIL与语音至EMAIL类似,也就是将送进系统的传真档案,转成
GIF的图档,以UUENCODE编码後再以EMAIL的形式送给使用者,因此使用者即使没
有传真机,依然可以接收对方的传真。因EFIX软体并未直接支援GIF的档案格式
,所以传真档案格式(tiffg3)要转成GIF档,尚需藉助其他的工具软体:
PBMPLUS,PBMPLUS是一组处理各式图档转换的程式,这里仅用到其中两个程式,
其转换流成为:
TIFFG3 -(efix)a PGM -(pgmtoppm)a PPM -(ppmtogif)a GIF
完整的传真至电子邮递副程式如下:
Fax2Mail()
{
# 先读取该使用者的设定
read userReg < ${MAINPATH}conf/$1.reg
# 由第五栏位得知USER的EMAIL
email=`$ECHO $userReg | cut -d"," -f5,5 -s`
# 由第十一栏位得知是否要发送EMAIL
to_email=`$ECHO $userReg | cut -d"," -f10,10 -s`
if [ '$to_email' != '0' ]; then
if [ $email ]; then
# 传真可能不只一页,找出每页档案
faxfiles=`$FIND ${MAINPA辉荽娴抵校灰腹鼸FIX即可将其转为
传真格式!
# 接续前面的PERL语言
# transfer to fax format
system("/usr/bin/efix -i text -o tiffg3 -n$FaxFile.%03d < $TMPFILE");
system("/bin/rm -f $TMPFILE");
#system("/bin/chmod go+w ${MsgPath}*no");
if ($bbc ne '') {
# Call User BBC,容後再说明
}
# ------------------------ Write to Callout--------------------------
if ( $FAXphone ne '' )
{
# 主动传真功能,容後再说明
}
EMAIL至语音
要将一中文纯文字档的内容念出,对我这种无任何资源辅助,也无语音
理论基础的人,最快也最笨的方式,就是需拥有所有BIG5码的单字语音档,如此
即可见一个字(例如:"中"字)就可以根据其BIG5码(A4A4)念一个字(
A4A4.pcm);只不过由此法念出的文章,并无抑扬顿挫,也无分辨破音字的能力
,仍有许多改进的空间。
要建立如此的语音档,我的方法如下:第一步是写一个小程式,利用前
面"在Linux上使用中文传真"一篇中论及的副程式 tran_code做筛检的工作,列出
所有合理的BIG5码及对应的中文字,且将结果存档,再来就是在WINDOWS上利用"
自然输入法"( 花旗资讯所出)把这一大篇的"文字",逐字念出,转录成一PCM档
案,在写一程式根据期间的中断静音,及先前列出的BIG5码对照表,逐字拆解存
档,即得到所有BIG5码的语音档。
得到语音档後,其他就单纯多了;在解出邮件之後,仅需将纯文字档移
至一特定目录下即可:
# 上接PERL语言邮件解码
# mv to mail2voc dir
system("/bin/mv $TMPFILE $MsgPath");
接著需在先前论及" 语音数据机录/放音"的程式范例中,"寻找此 USER 是否有
别人的留言"断落後再加上一行,寻找是否有EMAIL至与音的档案:
# Check User
if [ -f ${MAINPATH}conf/$UserID.reg ]; then
# 寻找此 USER 是否有别人的留言
vocfiles=`$FIND ${MAINPATH}voc/${UserID}.* -printf " %p"`
# 新加此行
mail2voc=`$FIND ${MAINPATH}voc/mail2voc/${UserID}.* -printf " %p"`
再在其後尚未填入的"------- EMAIL a Voice-----"段落中,加入
for FILE in $mail2voc; do
if [ -f $FILE ]; then
lines=`$WC -l < $FILE`
lineNDX=1
while [ $lineNDX -le "$lines" ]; do
files=`$T2S $FILE $lineNDX`
unknown=0
for PCM in $files; do
if [ -f ${PCM_PATH}$PCM ]; then
if [ $unknown -eq 1 ]; then
$SLEEP 1
unknown=0
fi
play_message ${PCM_PATH}$PCM "bcde"
if [ $? -ne 0 ]; then
hang_up
fi
else
unknown=1
fi
done
lineNDX=`expr $lineNDX + 1 `
done
fi
done
其中程式 t2s 是指Text to Speech,其将某一行的中文BIG5码逐个排列,以便顺
序念出。t2s.c的原始程式码如下:
#include <stdio.h>
void main (int argc,char *argv[])
{
FILE *fp1,*fp2;
int cnt,b1,b2,i,j;
unsigned char line[400];
fp1=fopen(argv[1],"r");
cnt=atoi(argv[2]);
j=0;
while (fgets(line,400,fp1)) {
if (cnt !=0) {
j++;
if (j!=cnt)
continue;
}
for (i=0 ; line[i] && i<400 ; i++) {
if (tran_code((int)line[i],(int)line[i+1]) != 0xffff) {
printf("%02x%02x.pcm ",(int)line[i],(int)line[i+1]);
i++;
}else{
printf("%02x.pcm ",(int)line[i]);
}
}
printf ("\n");
}
fclose(fp1);
}
int tran_code(int b1,int b2)
{
// 前篇已列出过,此处省略
}
结语
以上的讨论承接先前语音及传真的应用,探讨语音与EMAIL的互转,及传
真与EMAIL的互通,如此即可依不同的状况,选择您最适合的管道收送讯息;举例
来说,我大姊十岁女儿至国外小学念书,在那边上网收送EMAIL极为方便,但大姊
总嫌上网麻烦,因此他们即透过此系统,我大姊用传真将信件送过来,自动转成
EMAIL送去国外,待收到侄女回信後,转成传真格式,利用下一篇会提到的"主动
传真服务",送至我大姊家中,虽大姊家中也有电脑、数据机,问她为何不直接用
EMAIL和女儿对传,她总说:上网若没收到信,岂不又失望又花钱,在家等著传真
送到,岂不以逸待劳,轻松愉快!(稍做停顿又说),还可以Morning Call阿!
(侄女现在每天早上七点多,当地是晚间七点多,固定写信回家)
下一篇我将接著说明如何实作呼叫BBC、主动传真服务、及传真额外服务等功能!
撰文:朱先宇 1998/12/16
EMAIL: hybj@ms1.hinet.net
--
just a test
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.116.130.100]
BBS水木清华站∶精华区