早些时候写了一篇文章《树莓派打造淡入闹钟,让电台轻轻的叫你起床》,可是现在听FM音质差不说未必也太怀旧了;最近闲下来又写了个Shell脚本配合NeteaseCloudMusicAPI实现播放网易云音乐每日推荐歌曲,并支持插播一段天气预报或者自定义语音提示;由于是纯Shell实现理论上支持运行Shell的Linux系统都能使用。

环境准备

TTS API

使用百度语音将文本转换为音频文件

官方首页:百度TTS 注册教程:官方文档

Weather API

使用和风天气获取城市天气预报信息

官方首页:和风天气 注册教程:官方文档

Environment

Mplayer 播放音乐、播放天气预报以及语音类;JQ 分析API、分析Cookies并保存。

1
sudo apt-get install mplayer jq -y

获取网易云音乐的每日歌单需要依赖 NeteaseCloudMusicAPI 安装文档:网易云音乐API

1
2
3
4
5
#安装
git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
npm install
#运行
node app.js

安装脚本

安装好 NeteaseCloudMusicAPI 及注册了百度语音、和风天气后,直接拉取代码库或者在 Github 获取脚本放到任意目录并根据注释修改参数。

1
2
#拉取代码
sudo cd home && git clone https://github.com/Hscpro/NeteaseCloudMusic.git

脚本参数

只列出关键参数,完整脚本托管在 Github

主程序脚本

脚本名称:NeteaseCloudMusic 脚本参数:-weather(插播天气预报,可选)

播放音乐并插播天气预报:./NeteaseCloudMusic -weather

修改 playermusic() 函数中 if [ “$weather” = “-weather” ]&&[ “$1” = “1” ];then 1 可控制第几首播放天气(0为第一首,1为第二首以此类推)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#Systemd服务接口的notify通知,避免长时间占用Systemd
#使用Systemd的时候以notify模式启动,不使用的话可删除
if [ $INVOCATION_ID ];then
echo 'Systemd ID:' $INVOCATION_ID
systemd-notify --pid=$$
systemd-notify --ready
fi

#获取当前脚本所在文件夹路径
work_path=$(dirname $(readlink -f $0))

#网易云音乐账户
Phone="API限制账号必须为电话形式"
PassWord="账号密码"
#限制最大获取日推歌曲数(网易日推最大20)
number=20
#网易云音乐API服务地址默认为3000(NeteaseCloudMusicAPI)
APIService=localhost:3000
#Mplayer控制路径(控制歌曲淡出淡入的管道)
APIMplayer=/tmp/MplayerMusic-Control
#Mplayer均衡器(31Hz 62Hz 125Hz 250Hz 500Hz 1kHz 2Hz 4Hz 8kHz 16kHz)
effect=0:0:0:0:0:0:0:0:0:0
#定义储存歌曲ID数组与变量
declare -a dataid
musicid=""

··· 略 ···

function init(){
weather=$1
# 初始化系统播放音量
/usr/bin/amixer set PCM 95% > /dev/null
if [ -e "$APIMplayer" ]; then
rm $APIMplayer
fi
# Cookies保存位置(默认为当前脚本所在文件夹内的cache文件夹内)
chedir=$work_path/cache
}

··· 略 ···

function playermusic(){
#防止网络故障播放失败时影响下一曲
killall MplayerVolume > /dev/null 2>&1
killall mplayer > /dev/null 2>&1
killall Weather > /dev/null 2>&1
#歌曲淡入控制
if [ "$1" = "0" ];then
#第一首歌长淡入(以0.5秒的速度从0递增到55)
$work_path/MplayerVolume U $APIMplayer 0.5 0 50 &
else
#后续歌曲短淡入(以0.2秒的速度从0递增到35)
$work_path/MplayerVolume U $APIMplayer 0.2 0 35 &
fi
#插播天气预报(延时30秒以0.3秒的速度降低音量到15以35的音量播放天气预报后恢复到35)(第二首音乐)
if [ "$weather" = "-weather" ]&&[ "$1" = "1" ];then
sleep 1 && $work_path/Weather $APIMplayer 60 0.3 15 35 &
fi
#Mplayer播放音乐
mplayer -slave -input file=$APIMplayer -cache-min 10 -cache 51200 -really-quiet -softvol -volume 0 -af equalizer=$effect $2 > /dev/null 2>&1
}

··· 略 ···

和风天气脚本

脚本名称:Heweather 脚本参数:T天气简报/S生活指数/K空气质量

例如获取空气质量:./Heweather K

1
2
3
4
#和风天气KEY
key_access=c974d98ef5XXXXXXXXXXXXX5b218be

··· 略 ···

百度语音转换脚本

脚本名称:BaiduTTS 脚本参数参数:(需要转换的文本) (播放音量,若为空则输出音频播放地址)

例如播放一段文本:./BaiduTTS "Hello world" 50

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#设备码
id_mac=$(hostname)
#百度KEY
key_api=zDxXdXXXXXXXI42xxxRL8
key_secret=fab01dXXXXXXXXXXXXXXXXXXXXXX56543
#语速,取值0-9,默认为5中语速
tts_spd=5
#音调,取值0-9,默认为5中语调
tts_pit=5
#音量,取值0-15,默认为5中音量
tts_vol=10
#发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
tts_per=3
#Mplayer控制路径(语音)
APIMplayer=/tmp/MplayerTTS-Control

··· 略 ···

运行脚本

修改好参数后需要给脚本添加执行权限,并测试下

1
2
3
4
#获取权限
chmod 755 /home/NeteaseCloudMusic/*
#试运行
/home/NeteaseCloudMusic/NeteaseCloudMusic

定时启动

将脚本添加到 Systemd 或者 Crontab 即可实现定时启动既闹钟的功能

Systemd

/lib/systemd/system 创建两个文件

nano /lib/systemd/system/NeteaseCloudMusicApi.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=NeteaseCloudMusic Play
Requires=network.target NeteaseCloudMusicApi.service
After=network.target NeteaseCloudMusicApi.service
[Service]
Type=notify
Restart=no
#脚本所在路径
RootDirectory=/
WorkingDirectory=/home/NeteaseCloudMusic/
#执行的命令(播放音乐并插播天气预报)
ExecStart=/home/NeteaseCloudMusic//NeteaseCloudMusic -weather

nano /lib/systemd/system/NeteaseCloudMusic.timer

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=NeteaseCloudMusic
[Timer]
Unit=NeteaseCloudMusic.service
#每天8点启动
OnCalendar=*-*-* 08:00:00
AccuracySec=1m
WakeSystem=no
Persistent=no
[Install]
WantedBy=multi-user.target

安装 Unit

1
2
3
4
5
#安装定时器
systemctl enable NeteaseCloudMusic.timer
systemctl start NeteaseCloudMusic.timer
#查看定时器
systemctl list-timers

Crontab

运行命令 export EDITOR="nano" ; crontab -e -u root 在末尾添加一段代码

1
2
#每天8点播放音乐并插播天气预报
0 8 * * * /home/NeteaseCloudMusic//NeteaseCloudMusic -weather

END

How to live without music ?

文章协议: Attribution-NonCommercial-NoDerivatives
文章地址: https://www.hscbook.com/article/raspberrypi-cloudmusic/
除非注明,本博文章均为原创,转载请以链接形式标明本文地址