如果在 DLF Nova 广播流上播放音乐,则切换到 Spotify。
项目描述
DLF-Nova 播放我自己的音乐
DLF nova 播放列表只有几个小时,如果你听的时间足够长,会导致很多重复。这有点烦人,因为新闻很有趣。所以我编写了一个脚本来检测音乐/新闻,并在收音机的音乐部分切换到 Spotify。
这个项目正在进行中,我想让它更容易使用。
要求
- VLC https://www.videolan.org/vlc/
- spotify 帐户https://www.spotify.com
- spotify 客户端 ID:https ://developer.spotify.com/dashboard/applications
- 蟒蛇3.7
开始使用
- 要使用 Spotify API
client id
并且client secret
需要,可以在此处创建- 保存
SPOTIPY_CLIENT_ID
在您的环境中(示例1a2ef9787cc1638261545d6dadb2315
) - 保存
SPOTIPY_CLIENT_SECRET
在您的环境中(示例2c12e5161ace0476c8f2abc70a924ac76
)
- 保存
spotify_username
找到您的Spotify 用户名并将其插入online_prototype.py
- 安装
pip install DLF-Nova-Play-My-Own-Music
dlfnova -su my.spotifyusername
开始
在一些设置消息之后,它应该生成这样的日志
19:20:34: Class: music, prob.: 96%, filtered signal: 0%, AI performance: 3.3Hz
19:20:36: Class: music, prob.: 66%, filtered signal: 0%, AI performance: 3.5Hz
19:20:39: Class: news, prob.: 84%, filtered signal: 70%, AI performance: 3.3Hz
19:20:42: Class: news, prob.: 99%, filtered signal: 91%, AI performance: 3.3Hz switch to radio
[00000282eb2c49d0] prefetch stream error: unimplemented query (264) in control
19:20:44: Class: news, prob.: 100%, filtered signal: 97%, AI performance: 2.8Hz
19:20:47: Class: news, prob.: 100%, filtered signal: 99%, AI performance: 3.4Hz
19:20:49: Class: news, prob.: 100%, filtered signal: 100%, AI performance: 3.3Hz
技术细节
我训练了一个简单的深度学习模型来将音频单曲分类为“音乐”或“新闻”,使用这种分类,我在我的 spotify 设备和在线广播流之间切换。
数据集
数据集包括:
- 来自https://www.deutschlandfunknova.de/podcasts的 500MB DLF nova 播客
- 使用spotdl的 DLF nova Spotify 播放列表
- 流块
为了分割训练 (80%) 和测试 (20%) 数据集,文件在分割成块之前被随机分割。mp3 文件以 44100Hz 的频率分成 10 秒的块(无重叠)。每个块都转换为特征向量,使数据集文件相对较小。
输入向量/特征
基于这篇文章和这篇文章,我选择了三个特征:(MFCC
与语音/音乐分离相关,来自librosa),GFCC
(典型用于说话人识别,来自spafe)和onset_strength
(与音乐中的节拍检测相关,来自librosa)。它产生一个 256 维向量。
# feature vector
mfccs = librosa.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=20)
mfccs_scaled = np.mean(mfccs.T, axis=0)
try:
gfccs = gfcc(audio, num_ceps=20)
gfccs_scaled = np.mean(gfccs, axis=0)
except Exception:
gfccs_scaled = np.zeros(20)
hop_length = 2048
oenv = librosa.onset.onset_strength(y=audio, sr=sample_rate, hop_length=hop_length)
return np.hstack((mfccs_scaled, gfccs_scaled, oenv))
哪里audio
总是一个 44100Hz 采样率的 10 秒音频块。
深度学习模型
model = Sequential()
model.add(Dense(256, input_shape=(input_size,)))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(Dense(256))
model.add(Activation("relu"))
model.add(Dropout(0.5))
model.add(Dense(num_labels))
model.add(Activation("softmax"))
model.compile(loss="categorical_crossentropy", metrics=["accuracy"], optimizer="adam")
哪里input_size
是 256。
它训练了 100 个 epoch,默认学习率,批量大小 256,并以最低的验证损失保存了权重。
表现
它在训练期间达到了 99.8% 的准确率,在验证集上达到了 98%。
交换
该脚本online_prototype.py
通过 spotify API 注册并请求具有 OAUTH 权限以查看设备并修改播放器状态。它以 40kB 的块下载 DLF 流,并每 2 到 3 秒输出一次分类。该信号经过平滑处理并触发切换事件。收音机通过 VLC 流式传输。
已知的问题
- 由于模型简单,有些歌曲有时会被归类为新闻。尤其是说唱。新闻有时也会在背景中出现节拍。
[00000282eb2c49d0] prefetch stream error: ...
日志,它们来自 VLC
去做
- 训练更好的模型以减少切换错误
- 在切换事件期间淡出声音
项目详情
关
DLF_Nova_Play_My_Own_Music -0.1.3-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8771e81a665a68c776244cf2f85364e7c49cb984e9e13fc888508de947090162 |
|
MD5 | 2e2ef5daf0801d050a8b3ab19cd1484f |
|
布莱克2-256 | 2a61a7c216e4d1fa1fd33803d2dff4658938d5f6c71daf28ad09e89b304075fa |