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水木清华站∶精华区