树莓派版本:3B
Python:2.7
部分主要研究了GitHub上应用得比较广的几个调频广播项目,并基于此做了一定拓展。不但能播放指定频率的音频文件,还能播放mp3文件,网络流媒体。该部分同样制作了一个脚本,包含以下功能:
1.定制文本,用户输入文本后即能在对应频率上播放出来。
2.自由设定,基于百度语音的丰富功能,我们可选定人声的性别,声调,声速等多重信息。
3.RDS广播,基于PiFmRds项目,除发送音频信息外,还能发送站点/节目信息。
在GitHub上,已有成型的树莓派收音机项目,其中最早的是markondej的fm_transmitter项目。此后还有ChristopheJacquet的PiFmRds以及国人做的Fmpi项目。三者实现方法大同小异,通过GPIO4口以调频形式发出。经过考察,我以功能最为强大的PiFmRds为蓝本进行探索。
这类项目的核心问题就在于如何将音频信号转化成高频信号发射出去,它们主要对源文件进行了音频采样后,采用双边编码得到高频信号。因此源文件的要求也较为苛刻,要求是44100Hz的wav,ogi等格式。它的命令格式如下:
sudo ./pi_fm_rds -freq 98.5 -ps Chang-Radio -rt ‘Sound’ -audio song1.wav
自定义的项目很多,比如站名,报文,频率等。详见GitHub上介绍。套用本项目,我们可以将本地的wav文件通过调频信号输出,再由收音机收听。由于GPIO排针过短,应用杜邦线等金属物进行延伸。
我们日常中绝大多数的音频文件都是mp3格式,在此我们需要将音频文件进行转码。转码的工具很多,包括ffmpeg,sox,以ffmeg为例,他的命令格式如下:
ffmpeg -i http://XXX.mp3 -f wav -af atempo=1.5 - |sudo /home/pi/libsndfile-1.0.25/PiFmRds /src/pi_fm_rds -freq 98.5 -audio –
-i表示处理输入文件,-f wav表示强制转换成wav音频,-afatempo用于调节播放速度。
调节速度用于弥补转码造成的速度变慢(也可能是转码速度限制),提高编辑速度(损失部分音质)
这样,结合之前提取直链的方法,我们可以实现音乐电台的功能。
但是,相比于音箱,广播电台有许多的优点。它的传播范围大,无线传输更加便携,而且收听设备多样。我们不妨实现语音合成,让收音机“放”点什么出来。
在此,我使用的是百度语音合成API。它提供语音合成和语音识别功能,对于免费用户,也能拥有基本够用的使用次数,同样它有丰富的语音选项,可以调节多个参数。最后,它生成的链接非常简单,可直接使用。
基于此,我又制作了一个脚本。方法与之前的音乐脚本类似,输入参数及要说的话,即可发射对应频率。同样的,为了增加可用度,添加了帮助按钮及文本高亮。
效果图见图四,代码见附录部分。
# -*- coding: utf-8 -*-
import sys, getopt
import commands
def main(argv):
lanv = 'zh' #中文
perv = '0' #女声
pitv = '5' #音调
spdv = '5' #速度
txtv = '' #文本
freqv= '98.5'#调频
try:
opts, args = getopt.getopt(argv,'h',["lan=","per=","pit=","spd=","txt=","freq="])
except getopt.GetoptError:
print '对不起,参数输入不完整,请重新输入'
sys.exit()
for opt, arg in opts:
if opt == '-h':
print '--lan 选择语言\n--per 选择性别\n--pit 选择语调\n--txt 指定文本\n--freq 选定频率\n'
sys.exit()
elif opt in ("--lan"):
lanv = arg
elif opt in ("--per"):
perv = arg
elif opt in ("--pit"):
pitv = arg
elif opt in ("--spd"):
spdv = arg
elif opt in ("--txt"):
txtv = arg
elif opt in ("--freq"):
freqv = arg
a= 'ffmpeg -i "http://tsn.baidu.com/text2audio?tex=%sagain%sagain%sagain%sagain%send,thank,you,for,listening&lan=%s&per=%s&pit=%s&spd=%s&cuid=oGXAsR747nZGmlOiYbVd8xZG&ctp=1&tok=此处为百度语音tok信息,请替换" -f wav -ar 44.1k - | sudo /home/pi/libsndfile-1.0.25/PiFmRds/src/pi_fm_rds -freq %s -audio -' %(txtv,txtv,txtv,txtv,txtv,lanv,perv,pitv,spdv,freqv)
print '\n\033[5;31;40m♯♯\033[0m\033[0;31;40m正在播放:%s\033[0m\033[5;31;40m♯♯\033[0m'%(txtv)
a = commands.getoutput(a)
print("...End...\n")
if __name__ == "__main__":
main(sys.argv[1:])