Skip to main content

如果在 DLF Nova 广播流上播放音乐,则切换到 Spotify。

项目描述

亚历克斯

DLF-Nova 播放我自己的音乐

DLF nova 播放列表只有几个小时,如果你听的时间足够长,会导致很多重复。这有点烦人,因为新闻很有趣。所以我编写了一个脚本来检测音乐/新闻,并在收音机的音乐部分切换到 Spotify。

这个项目正在进行中,我想让它更容易使用。

要求

开始使用

  1. 要使用 Spotify APIclient id并且client secret需要,可以在此处创建
    1. 保存SPOTIPY_CLIENT_ID在您的环境中(示例1a2ef9787cc1638261545d6dadb2315
    2. 保存SPOTIPY_CLIENT_SECRET在您的环境中(示例2c12e5161ace0476c8f2abc70a924ac76
  2. spotify_username找到您的Spotify 用户名并将其插入online_prototype.py
  3. 安装pip install DLF-Nova-Play-My-Own-Music
  4. 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 设备和在线广播流之间切换。

数据集

数据集包括:

为了分割训练 (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 秒音频块。

深度学习模型

我使用了这篇中篇文章中的Keras模型

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

去做

  1. 训练更好的模型以减少切换错误
  2. 在切换事件期间淡出声音

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

DLF-Nova-Play-My-Own-Music-0.1.3.tar.gz (7.6 MB 查看哈希

已上传 source

内置分布

DLF_Nova_Play_My_Own_Music-0.1.3-py3-none-any.whl (7.7 MB 查看哈希

已上传 py3