【问题标题】:Saving audio from mp4 as wav file using Moviepy Audiofile使用 Moviepy Audiofile 将 mp4 中的音频保存为 wav 文件
【发布时间】:2019-08-28 05:26:39
【问题描述】:

我有一个名为'video.mp4' 的视频文件。我正在尝试从视频中分离一段音频并将其保存为可与其他 Python 模块一起使用的 wav 文件。我想用 MoviePy 做到这一点。

我向write_audiofile 函数发送参数,指定文件名、fps、nbyte 和编解码器。

按照 MoviePy AudioClip docs,我将编解码器指定为 ‘pcm_s32le’,用于 32 位 wav 文件。

from moviepy.editor import *

sound = AudioFileClip("video.mp4")
newsound = sound.subclip("00:00:13","00:00:15")   #audio from 13 to 15 seconds
newsound.write_audiofile("sound.wav", 44100, 2, 2000,"pcm_s32le")

此代码生成一个.wav 文件,名为'sound.wav'


打开Audacity中的音频文件

生成的文件 sound.wav 可以在 Audacity 中打开,但是当我尝试将其用作 wav 文件和其他 Python 模块时遇到问题。


播放pygame中的声音文件

import pygame
pygame.mixer.init()
sound=pygame.mixer.Sound("sound.wav")

第三行给出以下错误:

pygame.error: Unable to open file 'sound.wav'


使用 sndhdr.what() 确定声音文件的类型

import sndhdr
sndhdr.what("sound.wav")

sndhdr 方法返回none .根据docs,发生这种情况时,该方法无法确定文件中存储的声音数据的类型。


使用 Google 语音识别读取文件

import speech_recognition as sr
r = sr.Recognizer()
audio = "sound.wav"

with sr.AudioFile(audio) as source:
    audio = r.record(source)
text= r.recognize_google(audio)
print(text)

此代码在倒数第二行停止执行:

ValueError: Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format

如果sndhdr.what() 无法将其识别为音频文件类型,为什么音频文件会在 Audacity 中打开? 如何将 MoviePy AudioClip 正确导出为 wav 文件?

【问题讨论】:

    标签: python wav moviepy


    【解决方案1】:

    我遇到了同样的问题,没有指定编解码器或编解码器 = 'pcms32le',对我有用的是 pcm_s16le。 请注意,我使用的是“fr-FR”语言,您可能应该适应您的需求。 这是完整的代码:

    # Python code to convert video to audio
    import moviepy.editor as mp
    import speech_recognition as sr
    
    # Insert Local Video File Path
    clip = mp.VideoFileClip("/tmp/data/test.mp4")
    
    # Insert Local Audio File Path
    clip.audio.write_audiofile("/tmp/data/test.wav",codec='pcm_s16le')
    
    # initialize the recognizer
    r = sr.Recognizer()
    
    # open the file
    with sr.AudioFile("/tmp/data/test.wav") as source:
        # listen for the data (load audio to memory)
        audio_data = r.record(source)
        # recognize (convert from speech to text)
        text = r.recognize_google(audio_data, language = "fr-FR")
        print(text)
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我试图从 URL 获取 mp4 文件,然后将其转换为 wav 文件并通过它调用 Google Speech Recognition。相反,我使用 pydub 来处理转换并且它有效!以下是代码示例:

          import requests
          import io
          import speech_recognition as sr
          from pydub import AudioSegment
      
      
          # This function translate speech to text
          def speech_to_text(file):
              recognizer = sr.Recognizer()
              audio = sr.AudioFile(file)
              with audio as source:
                  speech = recognizer.record(source)
                  try:
                      # Call recognizer with audio and language
                      text = recognizer.recognize_google(speech, language='pt-BR')
                      print("Você disse: " + text)
                      return text
                  # If recognizer don't understand
                  except:
                      print("Não entendi")
      
          def mp4_to_wav(file):
              audio = AudioSegment.from_file(file, format="mp4")
              audio.export("audio.wav", format="wav")
              return audio
      
          def mp4_to_wav_mem(file):
              audio = AudioSegment.from_file_using_temporary_files(file, 'mp4')
              file = io.BytesIO()
              file = audio.export(file, format="wav")
              file.seek(0)
              return file
      
      
          url = ''
          r = requests.get(url, stream=True)
          file = io.BytesIO(r.content)
          file = mp4_to_wav_mem(file)
          speech_to_text(file)
      

      注意我写了两个函数:mp4_to_wav 和 mp4_to_wav_mem。唯一的区别是 mp4_to_wav_mem 处理内存中的所有文件,而 mp4_to_wav 生成 .wav 文件。

      【讨论】:

        【解决方案3】:

        看了MoviePy的文档,发现参数nbyte应该和codec一致。 nbyte 用于采样宽度(16 位声音设置为 2,32 位声音设置为 4)。因此,最好在设置codec=pcm_s32le 时设置nbyte=4

        【讨论】:

          【解决方案4】:

          我认为这是正确的方法:

          import os
          from moviepy.editor import AudioFileClip
          
          PATH= "files/"
          fileName = "nameOfYourFile.mp4"
          newFileName = "nameOfTheNewFile"
          Ext = "wav"
          AudioFileClip(os.path.join(PATH, f"{fileName}")).write_audiofile(os.path.join(PATH, f"{newFileName}.{Ext}"))
          

          【讨论】:

          • 虽然此代码 sn-p 可能会解决问题,但请考虑说明它的工作原理和原因,以使此答案对问题的未来访问者更有用。
          【解决方案5】:

          我认为这种方法很容易理解。

          from moviepy.editor import *
          input_file = "../Database/myvoice.mp4"
          output_file = "../Database/myvoice.wav"
          sound = AudioFileClip(input_file)
          sound.write_audiofile(output_file, 44100, 2, 2000,"pcm_s32le")
          

          【讨论】:

          • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
          猜你喜欢
          • 2019-12-31
          • 2018-05-15
          • 1970-01-01
          • 1970-01-01
          • 2018-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多