- 想到了利用树莓派来播放语音, 树莓派插上广播, 使用mplayer播放语音文件, 可以达到这个目的.
现在经常用来把下班行程告诉岳母, 然后根据语音提示,合理的安排做饭时间. 一般到家正好开饭. 哈哈。硬件
- 树莓派 2 代Model B (1/3代也肯定没问题, 我只有一个2代.)
- 广播(淘宝10~20元即可, usb供电)
软件
- 树莓派需要公网IP, 或者内网穿透需要有公网的服务器(推荐frp, 真是稳如狗, 我现在就是使用的它)
- 注册telegram, 创建telegram bot. (telegram已经被屏蔽, 需要翻墙自行解决),
之前也想通过微信公众号来做, 奈何微信公众号需要认证(费用300/年)个人公众号还无法认证, QTMD微信, 我就想接收一个语言文件而已.
Telegram Bot
我也由此接触到Telegram, 知道到了telegram bot可以做很多事件,
深入了解后我也加入了有很多开车群(哎, 不说了, 你懂的, 赶紧喝袋牛奶补补, 要不然营养跟不上了, 哈哈).- 注册Telegram就不多说了, 有手机号的都行(google voice也可以)
- 创建Telegram bot https://core.telegram.org/bots 这是telegram bot地址, 跟着步骤你就可以创建你想实现的bot.
这里我简单说几点:和BotFather 对话来创建bot.
创建完成你应该得到一个bot token, 类似这个317386679:AAGvecIfPbxZpPtlT4iNOKkIcufgRNk19JM. - Bot 接收消息有两种互斥的方法, 一个getUpdates主动去请求服务查看是否有新消息,
另一个是Webhooks, 当服务有新消息,会主动把消息转给你设定好的API地址, 这些方式需要占用一个443端口,
这两种方式看个人喜好, 我个人推荐第二种, 不占用443端口, 详细看这里https://core.telegram.org/bots/api - 由于Telegram bot api 比较成熟, 已经有许多语言的SDK直接拿过来就可以使用, 写自己的逻辑代码就行了,
我刚开始使用是.Net版本https://github.com/TelegramBots/telegram.bot,
后来又换成了Python版本https://github.com/python-telegram-bot/python-telegram-bot
Telegram Bot 接收消息
消息包括命令, 语音, 文本, 图片, 音频, 视频等
我们做的主要是处理语音, 把收到的语音添加到一个消息队列, 后台再慢慢把语音文件发送到树莓派指定文件夹.
我们做的主要是处理语音, 把收到的语音添加到一个消息队列, 后台再慢慢把语音文件发送到树莓派指定文件夹.
- 处理语音, 并下载语音文件(Bot有一个限制, 接收文件最大不超过20MB)
def audio_process(bot, update):
audio = update.message.audio if update.message.audio else update.message.voice
file = bot.get_file(audio.file_id)
filename = '{}-{}.{}'.format(datetime.today().strftime('%Y%m%d-%H%M%S'), audio.file_id, file.file_path.split('.')[-1])
filepath = '{}/{}'.format(common.voice_path, filename)
#print(filepath, file.file_path)
with open(filepath, 'wb') as f:
file.download(out = f)
#sync file
sync_file.enter(filename)
bot.send_message(chat_id= update.message.chat_id, text = 'Thanks, we have received your voice...')
- 然后把语音文件发送树莓派指定文件夹
def sync_file(self, filename):
logging.info('start sync file:{}'.format(filename))
localFile = '{}/{}'.format(common.voice_path, filename)
remoteFile = '{}/{}'.format(common.ssh_path, filename)
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(common.ssh_server, common.ssh_port, common.ssh_username, common.ssh_password)
sftp = client.open_sftp()
sftp.put(localFile, remoteFile)
sftp.close()
client.close()
logging.info('end sync file:{}'.format(filename))
- 树莓派每分钟都会执行脚本检查是否有新的语音文件, 如果有新的语音文件就播放, 并把它移动到Backup文件夹.
#!/bin/bash
path=~/tmp/*
backup=~/tmp/backup
player=/usr/bin/mplayer
reminder=~/tmp/remind/reminder.mp3
flag=true
for file in $path
do
if [ -f $file ];then
#echo $file
if [ "$flag" ] ; then
$player $reminder
flag=false
fi
$player $file
$player $file
mv $file $backup
fi
done
总结
代码是不是很简单, 完整项目在Github上 https://github.com/tianzhenyun/python-telegram-bot,
这里有详细的代码, 有需要的同学可以仔细看一下.
这里有详细的代码, 有需要的同学可以仔细看一下.
--------------------
用Raspberry Pi整点报时
完整的音频文件及脚本: Github
参考链接:
- 安装Mplayer
- 下载语音文件(解压到/{home})
- 创建脚本文件TimeAudio.sh(/usr/local/bin)
#!/bin/bash
filePath=/{home}/TimeAudio
Time=`date +%H%M`
audioFile="$filePath/$Time.mp3"
#echo $audioFile
player=/usr/bin/mplayer
$player $audioFile
- 保存后加执行权限:
chmod +x /usr/local/bin/TimeAudio.sh
- 加入定时计划 crontab, 运行:
crontab -e
添加如下代码
0 * * * * /usr/local/bin/TimeAudio.sh
#!/bin/bash
filePath=/{home}/TimeAudio
Time=`date +%H%M`
audioFile="$filePath/$Time.mp3"
#echo $audioFile
player=/usr/bin/mplayer
$player $audioFile
chmod +x /usr/local/bin/TimeAudio.sh
crontab -e
添加如下代码0 * * * * /usr/local/bin/TimeAudio.sh
No comments:
Post a Comment