存档

文章标签 ‘vgetty’

Linux上装个语音信箱

2010年1月29日 没有评论

我的一台运行Fedora Core 7的台式机基本上一直开机,旁边的电话只是为了ADSL申请的,偶尔打电话。收拾东西,翻出了一个2000年联想外置modem,那么既然一直开机,不如在上面用软件+Modem做一个语音信箱。

找了一下,找到了mgetty,在FC7的yum可以直接得到,还可以装mgetty-sendfax/viewfax

  • 连接modem,我这里使用的是联想的外置modem,连接到ttyS0
  • 修改/etc/inittab,增加:

S0:345:respawn:/sbin/vgetty ttyS0

  • 执行 telinit q,要求系统重读inittab
  • 此时,打电话过来,3声后modem就会应答。缺省的没有语音文件,直接是“嘀”声后开始录音。

自动应答用的欢迎辞,可以自己录制一段wav,或者通过打过来留言的方式将留言修改为欢迎辞。

要使用wav转换,要知道modem用的什么格式,可以先打个电话过来,留一个留言。在/var/spool/voice/incoming下可以找到这个文件,执行“rmdfile <rmd文件>”就可以看到文件信息,比如我的就是

v-5402-1251737265.rmd: RMD1

modem type is: "US Robotics"

compression method: 0×0001

sample speed: 8000

bits per sample: 8

先将录制好的wav转成pvf:

wavtopvf <.wav> | pvfspeed -s 8000 > <.pvf>

这里的8000就是从上面sample speed得到的

再将pvf转成rmd:

pvftormd US_Robotics 1 <.pvf> /var/spool/voice/messages/standard.rmd

这里,/var/spool/voice/messages/standard.rmd就是mgetty缺省的提示语音文件。

再打个电话过来,就可以听到提示音了。

到这里,语音信箱的基本功能就完成了。在接到电话3声没有应答后,modem启动播放录制好的欢迎辞,然后发出录音开始的提示音。当检测到呼叫方按电话按键或者忙音、以及7秒的静音后,结束录制,挂机。

按照mgetty的设计,在收到留言后,主人可以打电话过来收听。但既然电脑是联网的,我将留言配置发送到我的邮箱,这样可以在任何联网电脑上收听留言了。这里我选择发送到我的Gmail邮箱,不但因为常用,而且在Web页面上就可以直接收听附件中的mp3文件。

留言录音需要经过一系列转换,才能生成mp3文件。同时,发现一个问题,就是这个modem对忙音的检测有问题,如果是呼叫方主动挂机,modem收到忙音也检测不到。查了一下at命令集,s96应该是设置忙音频率的,但这个modem没有s96的寄存器。所以,当对方挂机后,留言会录制十几秒的忙音,1分钟的催挂音,然后是静音。静音检测是没有问题的,当有检测到7秒静音后,就会挂机。虽然有些别扭,但影响也就是1分多钟打不进电话,我也没有这么忙,问题不大。用sox处理一下声音文件,将950HZ和450HZ的声音滤掉,再从后面删除静音部分,这样得到的声音长度就是语音部分的长度。再将原始文件按照这个长度截一下。这样做在噪音比较小的时候,可以很好的去掉发送到gmail的忙音和催挂音,但当噪音比较大的时候,就不起作用了。不过总比什么都不做好。

处理脚本,message.sh

#!/bin/bash

MESSAGE=$1

CALLERID=$2

CALLNAME=$3

WAVFILE=`echo $MESSAGE | sed ’s/.rmd$/.wav/’`

TMPFILE=`echo $MESSAGE | sed ’s/.rmd$/.tmp.wav/’`

MP3FILE=`echo $MESSAGE | sed ’s/.rmd$/.mp3/’`

rmdtopvf $MESSAGE | pvfspeed -s 8000 | pvftowav > $WAVFILE

sox $WAVFILE $TMPFILE equalizer 950 3h -100 equalizer 450 3h -100 reverse silence 1 5 2%

VOICELEN=`/etc/mgetty+sendfax/audiolen.pl $TMPFILE`

sox $WAVFILE $TMPFILE trim 0 $VOICELEN

lame $TMPFILE $MP3FILE

rm $WAVFILE

rm $TMPFILE

DATE=`date "+%Y-%m-%d %H:%M:%S"`

echo "Number: $CALLERID   Name: $CALLNAME   Length:$MP3LEN" | mutt -s "[$DATE] Telephone message" -F /etc/mgetty+sendfax/mutt.conf -a $MP3FILE <email address>

exit 0

其中,mutt.conf是一个配置文件,其实也可以通过命令行来实现:

文件里就两行:

set from=voicemail@infoby.info

set realname="Home Voice Mail"

sed还是不知道怎么用,就用了perl取文件时长:

#!/usr/bin/perl

$file = $ARGV[0];

$cmd = `sox $file -n stat 2>&1`;

if ($cmd=~/Length \(seconds\):\s+(\d+\.\d+)/) {

        print $1+5.0;

}

 

然后,在/etc/mgetty_sendfax/voice.conf中找到message_program,改为

message_program /etc/mgetty+sendfax/message.sh

当收到新的留言时,就会将留言转为mp3文件,作为附件发送到gmail里。

 

参考:

分类: 软件使用 标签: , ,