如何将只有音频的mp4转换为numpy数组

93ze6v8z  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(115)

我想:
从Youtube下载音频文件
我已经用pytube完成了,然而,它被格式化为mp4,即使我将only_audio设置为True。
然后将音频文件转换为numpy数组
有些库可以在mp3上运行,例如pydub,但不能在mp4上运行。当我尝试moviepy时,它失败了,因为没有视频,因此没有帧率。我不想下载视频,因为这将需要更长的时间。
请注意,我想要音频,而不是视频。
如何:
从youtube下载音频然后把它变成numpy数组
感谢任何帮助:)

编辑

感谢您的评论,我已经设法把mp4到mp3使用ffmpeg
然而,当我试图使用this question中的代码将其转换为numpy数组时,它看起来像这样:

def read(f, normalized=False):
    """MP3 to numpy array"""
    a = pydub.AudioSegment.from_mp3(f)
    y = np.array(a.get_array_of_samples())
    if a.channels == 2:
        y = y.reshape((-1, 2))
    if normalized:
        return a.frame_rate, np.float32(y) / 2**15
    else:
        return a.frame_rate, y

字符串
它引发了这个错误:

Traceback (most recent call last):
  File "C:\Users\myname\Google Drive\Python\Projects\Music\Downloads\Music Read.py", line 63, in <module>
    print(read(x,True))
  ......
  File "C:\Users\myname\AppData\Local\Programs\Python\Python36\lib\subprocess.py", line 1017, in _execute_child
    startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified


这很奇怪,因为如下所示,路径应该可以完美地工作

for f in os.listdir(path):
    if (f.endswith(".mp3")):
        print(f)
        x = 'C:/Users/myname/Google Drive/Python/Projects/Music/Downloads/{}'.format(f)
        print(os.path.exists(x))
        print(open(x))
        print(read(x,True))


产出:

test-Copy.mp3
True
c:/users/myname/google drive/python/projects/music/downloads/test-copy.mp3
<_io.TextIOWrapper name='c:/users/myname/google drive/python/projects/music/downloads/test-copy.mp3' mode='r' encoding='cp1252'>


此外,当我输入一个实际上不存在的文件路径时,它会输出一个不同的错误:

......
File "C:\Users\myname\AppData\Local\Programs\Python\Python36\lib\site-packages\pydub\utils.py", line 57, in _fd_or_path_or_tempfile
fd = open(fd, mode=mode)
FileNotFoundError: [Errno 2] No such file or directory: 'c:/users/myname/google drive/python/projects/music/downloads/hi'


如何使用来自this question的代码将mp3转换为numpy数组,如果我不能,还能怎么做?
顺便说一句,我在Win10上运行Python 3.6
我真的希望我已经说得够清楚了,再次感谢你的任何建议:)

wgmfuz8q

wgmfuz8q1#

这是一个奇怪的回答我自己的问题,但:
我通过使用以下代码解决了pydub问题:

def decode (fname):
    # If you are on Windows use full path to ffmpeg.exe
    cmd = ["C:/Users/allen/Google Drive/Python/Tools/ffmpeg-20190604-d3f236b-win64-static/bin/ffmpeg.exe", "-i", fname, "-f", "wav", "-"]
    # If you are on W add argument creationflags=0x8000000 to prevent another console window jumping out
    p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    data = p.communicate()[0]
    return np.fromstring(data[data.find(data)+4:], np.int16)

字符串

相关问题