python - librosa.load() 无法准确解码来自 Youtube 的音频文件
问题描述
我正在尝试对文件运行librosa.load()
命令.wav
。是通过youtube-dl.wav file
从 youtube 视频下载的,具有以下属性:
- 通道数:2
- 采样率:44,100Hz
- 持续时间:3486.104 秒
但是,该命令返回的时间序列librosa.load('file.wav')
如下:
(array([0., 0., 0., ..., 0., 0., 0.], dtype=float32), 22050)
该.wav
文件肯定有很多噪音,所以我不太明白为什么输出是0
每一帧的。
我还尝试在其他 Youtube 视频的其他音频文件上运行并得到相同的结果librosa.load()
。.wav
如果有人对导致此输出的原因有任何想法,请现在告诉我。提前致谢。
解决方案
Youtube 不存储 WAV 文件。因此,当向 youtube-dl 询问 WAV 时,它所做的只是在下载后将 MPEG4/OPUS 转换为 WAV 文件(使用 ffmpeg)。这不会提高质量,只会占用更多的硬盘空间。此转换中可能出现问题,导致您的文件只是充满了沉默。
由于 librosa 可以加载 MPEG4 音频(当安装了合适的依赖项时),我建议下载它,然后直接加载它。请参阅下面的示例代码。
使用 youtube-dl 下载 MP4 音频
youtube-dl -ci -f "bestaudio[ext=m4a]" https://www.youtube.com/watch?v=-5FKNViujeM -o '%(id)s.mp4'
在 Python 中加载文件
import librosa
import numpy
sr = 16000
y, _ = librosa.load('-5FKNViujeM.mp4', duration=7, sr=sr) # load first seconds
# Calculate RMS
rms_window = 1.0 # in seconds
rms = librosa.feature.rms(y=y, hop_length=int(sr*rms_window))
rms_db = librosa.core.amplitude_to_db(rms, ref=0.0)
print(list(rms_db[0]))
输出
[1.9082947, 79.42775, 77.47075, 80.536514, 81.758995, 81.908295, 78.63311, 80.665535]
推荐阅读
- python - 可以将列表更改应用于其他列表的功能
- java - 选择 webdriver 中包含文本的任何元素
- php - Laravel 5.8:插入数据库似乎不起作用
- javascript - 使用 Webpack 在开发中运行使用 `fs` 和 `sharp` 的 Next.js 脚本?
- pandas - 时间序列的数据操作
- python - 10,000 项复合的类斐波那契数列
- java - 从 Python 获取数据并使用 Java 和 Thymleaf 进行打印
- reactjs - 在反应中使用 Babel 运行 Webpack 时面临问题
- android - 使用 WordPress REST API 进行 Flutter 分页
- java - 更改移动字体时应用程序字体更改