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

环境准备

TTS API

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

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

Weather API

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

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

Environment

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

1
sudo apt-get install mplayer jq npm -y

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

1
#安装
2
git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
3
npm install
4
#运行
5
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
#Systemd服务接口的notify通知,避免长时间占用Systemd
2
#使用Systemd的时候以notify模式启动,不使用的话可删除
3
if [ $INVOCATION_ID ];then 
4
    echo 'Systemd ID:' $INVOCATION_ID
5
    systemd-notify --pid=$$
6
    systemd-notify --ready
7
fi
8
9
#获取当前脚本所在文件夹路径
10
work_path=$(dirname $(readlink -f $0))
11
12
#网易云音乐账户
13
Phone="API限制账号必须为电话形式"
14
PassWord="账号密码"
15
#限制最大获取日推歌曲数(网易日推最大20)
16
number=20
17
#网易云音乐API服务地址默认为3000(NeteaseCloudMusicAPI)
18
APIService=localhost:3000
19
#Mplayer控制路径(控制歌曲淡出淡入的管道)
20
APIMplayer=/tmp/MplayerMusic-Control
21
#Mplayer均衡器(31Hz 62Hz 125Hz 250Hz 500Hz 1kHz 2Hz 4Hz 8kHz 16kHz)
22
effect=0:0:0:0:0:0:0:0:0:0
23
#定义储存歌曲ID数组与变量
24
declare -a dataid
25
musicid=""
26
27
··· 略 ···
28
29
function init(){
30
  weather=$1
31
  # 初始化系统播放音量
32
  /usr/bin/amixer set PCM 95% > /dev/null
33
  if [ -e "$APIMplayer" ]; then
34
    rm $APIMplayer
35
  fi
36
  # Cookies保存位置(默认为当前脚本所在文件夹内的cache文件夹内)
37
  chedir=$work_path/cache
38
}
39
40
··· 略 ···
41
42
function playermusic(){
43
  #防止网络故障播放失败时影响下一曲
44
  killall MplayerVolume > /dev/null 2>&1
45
  killall mplayer > /dev/null 2>&1
46
  killall Weather > /dev/null 2>&1
47
  #歌曲淡入控制
48
  if [ "$1" = "0" ];then
49
    #第一首歌长淡入(以0.5秒的速度从0递增到55)
50
    $work_path/MplayerVolume U $APIMplayer 0.5 0 50 &
51
  else
52
    #后续歌曲短淡入(以0.2秒的速度从0递增到35)
53
    $work_path/MplayerVolume U $APIMplayer 0.2 0 35 &
54
  fi
55
  #插播天气预报(延时30秒以0.3秒的速度降低音量到15以35的音量播放天气预报后恢复到35)(第二首音乐)
56
  if [ "$weather" = "-weather" ]&&[ "$1" = "1" ];then
57
    sleep 1 && $work_path/Weather $APIMplayer 60 0.3 15 35 &
58
  fi
59
  #Mplayer播放音乐
60
  mplayer -slave -input file=$APIMplayer -cache-min 10 -cache 51200 -really-quiet -softvol -volume 0 -af equalizer=$effect $2 > /dev/null 2>&1
61
}
62
63
··· 略 ···

和风天气脚本

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

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

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

百度语音转换脚本

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

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

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

运行脚本

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

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

定时启动

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

Systemd

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

nano /lib/systemd/system/NeteaseCloudMusicApi.service

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

nano /lib/systemd/system/NeteaseCloudMusic.timer

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

安装 Unit

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

Crontab

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

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

END

How to live without music ?