基于树莓派的语音邮件收发

一、 软硬件环境及搭建

硬件需要

  • 3代b型E14中国版树莓派
  • 8G以上SD卡
  • USB麦克风
  • 3.5mm插孔音箱或蓝牙音箱

软件环境

由于没有显示器,所以选择SSH或远程桌面方式连接树莓派。若有显示器可忽略。

环境搭建

1. 烧录镜像

参考教程:http://shumeipai.nxez.com/2013/09/07/raspberry-pi-under-windows-system-installation-to-sd-card.html

2. 连接硬件

将安装好的SD卡插入树莓派卡槽,USB麦克风插入USB接口,插头音箱插入3.5mm插孔。用网线连接路由器,电脑也要连接同一个路由器,保证两者在同一局域网内。

3. 使用VNC远程树莓派桌面

参考教程:http://shumeipai.nxez.com/2018/08/31/raspberry-pi-vnc-viewer-configuration-tutorial.html

以上步骤完成后就可以愉快地使用树莓派了

4. 百度语音识别与合成SDK安装

  • 注册百度AI平台账号
  • 创建语音应用,获取APP_ID,API_KEY,SECRET_KEY
  • 安装SDK
    这里采用Python开发,所以pip install baidu-aip即可

附:使用FileZilla在本机及树莓派之间进行文件传输

在这里插入图片描述

  • 主机:使用sftp协议。填入:sftp://树莓派ip地址
  • 用户名:pi
  • 密码:raspberry
  • 端口:一般为22

输入信息后点击快速连接就能传输文件了。

二、Python代码实现

分为邮件发送、邮件接收、语音识别、语音播报四个模块。

1.邮件发送

使用email、smtplib模块

定义Email的地址,口令和SMTP服务器地址

FROM='你的邮箱地址'
password = "授权码"
smtp_server = "smtp服务器地址"

通过语音识别得到要发送的邮件内容

#根据语音提示输入音频,识别并返回结果
speak.say('to.wav')
start=rec.rec(10)
speak.say('toe.wav')
end=rec.rec(5).lower()
TO=start+'@'+end+'.com'
print(TO)                #由于不能识别特殊符号,所以就把接收邮箱内容分割输入
speak.say('toname.wav')
name=rec.rec(5)
speak.say('tosub.wav')
SUBJECT=rec.rec(5)
speak.say('totext.wav')
text=rec.rec(10)

定义邮件本身的内容

msg = MIMEMultipart()
msg["From"] = _format_addr("CC <%s>" % FROM)
msg["To"] = _format_addr("%s <%s>" % (name,TO))
msg["Subject"] = Header(SUBJECT, "utf-8").encode()

定义邮件正文
msg.attach(MIMEText(text, "plain", "utf-8"))

定义发送文件

try:
    server = smtplib.SMTP(smtp_server, 25)
    server.login(FROM, "221507cc")
    server.sendmail(FROM, [TO], msg.as_string())
    server.quit()
    speak.say('success.wav')
except Exception,e:
    speak.say('faild.wav')
    print str(e)

2.邮件接收

使用email、poplib模块

定义接收邮箱的地址,口令和POP服务器地址

email='接收邮箱地址'
passwd='授权码'
pop_server='pop服务器地址'

连接POP服务器

server=poplib.POP3_SSL(pop_server,'995')
server.user(email)
server.pass_(passwd)

下载获取邮件

#返回所有邮件编号
resp,mails,octets=server.list()
index=len(mails) #所有邮件数
if index<1:
    return None
resp,lines,octets=server.retr(index)
#获取最新一封邮件,索引号是从1开始的。lines存储了邮件的原始文本的每一行

msg_content=b'\r\n'.join(lines).decode('utf-8')
#把邮件内容解析为Massage对象,用来解析邮件
msg=Parser().parsestr(msg_content)
server.quit()
print_info(msg)

解析邮件内容
递归打印出Massage对象的层次结构内容。
比如说一开始打印的是根对象内容,即发送者、接收者、主题
若还有其他对象(如文本内容、附件等)则indent+1,继续打印。

def print_info(my_msg,indent=0):
    if indent==0:
        #邮件的From,To,Subject存在于跟对象上
        for header in ['From','Subject']:
            value=my_msg.get(header,'')
            if value:
                if header=='Subject':
                    #解码Subject字符串
                    value=decode_str(value)
                    print('主题:%s' %value)
                    if (value==None):
                        tts('主题是无','subject.wav')
                    else:
                        tts('主题是'+value,'subject.wav')
                else:
                    #解码Email地址
                    hdr,addr=parseaddr(value)
                    name=decode_str(hdr)
                    print('发送者:%s' %name)
                    if (name==None):
                        tts('发送者是未知','send.wav')
                    else:
                        tts('发送者是'+name,'send.wav')
                        
    #若还有其他对象(如文本内容、附件等)则继续打印。
    if my_msg.is_multipart():
        parts=my_msg.get_payload()
        for n,part in enumerate(parts):
            print('%spart %s' %(' ' * indent,n))
            print('%s-----------------------------------' % ' ' * indent)
            print_info(part, indent + 1)
            
    #文本内容
    else:
        content_type = my_msg.get_content_type()
        if content_type == 'text/plain' :   
            content = my_msg.get_payload(decode=True)
            #检测文本编码
            charset = guess_charset(my_msg)
            if charset:
                content = content.decode(charset)
                print('Text: %s' % (content))
                if (content==None):
                    tts('邮件内容是无','content.wav')
                else:
                    tts('邮件内容是'+content,'content.wav')

利用百度语音合成获取的邮件内容

#""" 你的 APPID AK SK """
APP_ID = '16106037'
API_KEY = 'o7n2ma4eMNa4oUEbITZBcmZM'
SECRET_KEY = 'jz2aGbb4OcvobIc7DvC5mgide0ExFUYw'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

#语音播报,传入的参数:
#text:语音播报内容
#flag:保存的文件名
def tts(text,flag):
    result  = client.synthesis(text, 'zh', 1, {
        'vol': 5,
    })
  
    # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
    if not isinstance(result, dict):
        with open('./'+flag, 'wb') as f:
            f.write(result)

3.语音识别

新建AipSpeech

APP_ID = '16106037'
API_KEY = 'o7n2ma4eMNa4oUEbITZBcmZM'
SECRET_KEY = 'jz2aGbb4OcvobIc7DvC5mgide0ExFUYw'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

调用接口进行语音识别

def rec(s):
        print('recording......')
        #调用系统命令进行录音
        os.system('arecord -D hw:1,0 -d %d -t wav -c 1 -r 44100 -f S16_LE test.wav' %s)
        print('finish')
        #由于采样率不匹配,且语音识别推荐pcm文件,所以需要对音频进行转码
        os.system('ffmpeg -y -i test.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 test.pcm')
        
        # 读取文件
        def get_file_content(filePath):
            with open('test.pcm', 'rb') as fp:
                return fp.read()
                
        # 识别本地文件
        result=client.asr(get_file_content('test.pcm'), 'pcm', 16000, {
            'dev_pid': 1536,
        })
        print(result)
        
        # 解析返回值,打印语音识别的结果
        if result['err_msg']=='success.':
            word = result['result'][0].encode('utf-8')       # utf-8编码
            if word!='':
                        print (word.decode('utf-8').encode('gbk'))
                        return word
            else:
                print "音频文件不存在或格式错误"
        else:
            print "错误"

4.语音播报

调用系统命令播放音频,其中传入参数为文件名

def say(flag):
	os.system("mpv "+flag)

5.主函数

根据语音指令执行任务,直到结束跳出循环,程序结束。

while(True):
	print('start!')
	listen=rec.rec(7)
	if listen=='我要发邮件':
		send.main()
	elif listen=='最近一封邮件':
		receive.main()
	elif listen=='结束':
		speak.say('end.wav')
		break
	else:
		speak.say('respeak.wav')

6.脚本文件

最后写一个.sh文件一键运行代码

python main.py

附录

代码源码地址:https://github.com/HolmeC/VoiceMailRaspberryPi
参考资料:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320098721191b70a2cf7b5441deb01595edd8147196000

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值