Python 使用Moviepy Audiofile将mp4中的音频保存为wav文件

Python 使用Moviepy Audiofile将mp4中的音频保存为wav文件,python,wav,moviepy,Python,Wav,Moviepy,我有一个名为'video.mp4'的视频文件。我试图从视频中分离出一段音频,并将其保存为wav文件,以便与其他Python模块一起使用。我想和MoviePy一起做这件事 我向write_audiofile函数发送参数,指定文件名、fps、nbyte和编解码器 在MoviePy音频剪辑之后,我将32位wav文件的编解码器指定为'pcm_s32le' from moviepy.editor import * sound = AudioFileClip("video.mp4")

我有一个名为
'video.mp4'
的视频文件。我试图从视频中分离出一段音频,并将其保存为wav文件,以便与其他Python模块一起使用。我想和MoviePy一起做这件事

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

在MoviePy音频剪辑之后,我将32位wav文件的编解码器指定为
'pcm_s32le'

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")
此代码生成一个名为
'sound.wav'
.wav
文件


在中打开音频文件 生成的文件,
sound.wav
,可以在Audacity中打开,但是当我尝试将其作为wav文件与其他Python模块一起使用时,遇到了问题


在中播放声音文件 第三行给出了以下错误:

pygame.error:无法打开文件'sound.wav'


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


使用谷歌语音识别读取文件 此代码在倒数第二行停止执行:

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音频剪辑正确导出为
wav
文件?

我也有同样的问题。我试图从URL中获取一个mp4文件,然后将其转换为wav文件,并通过它调用Google语音识别。相反,我使用pydub来处理转换,它成功了!下面是代码示例:

导入请求
输入io
将语音识别作为sr导入
从pydub导入音频段
#此函数用于将语音转换为文本
def语音到文本(文件):
识别器=高级识别器()
audio=sr.AudioFile(文件)
以音频作为源:
语音=识别器。记录(源)
尝试:
#具有音频和语言的呼叫识别器
text=recognizer.recognizer\u谷歌(语音、语言='pt-BR')
打印(“Vocêdise:+文本)
返回文本
#如果识别器不明白
除:
印刷品(“Não entendi”)
def mp4_至_wav(文件):
音频=音频段。来自_文件(文件,格式=“mp4”)
导出(“audio.wav”,format=“wav”)
返回音频
def mp4_至_wav_mem(文件):
音频=音频段。使用临时文件(文件“mp4”)从文件
file=io.BytesIO()
file=audio.export(文件,format=“wav”)
file.seek(0)
返回文件
url=“”
r=requests.get(url,stream=True)
file=io.BytesIO(r.content)
文件=mp4_到_wav_mem(文件)
语音到文本(文件)

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

我阅读了MoviePy的文档,发现参数
nbyte
应该与
codec
一致
nbyte
表示采样宽度(16位声音设置为2,32位声音设置为4)。因此,最好设置
nbyte=4
,当您设置
codec=pcm_s32le
时,我遇到了相同的问题,没有指定codec,或者codec='pcms32le',对我有效的是pcm_s16le
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")
请注意,我使用的是“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)

我认为这是正确的方法:

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}"))

虽然这个代码片段可以解决这个问题,但请考虑解释它如何以及为什么工作,使这个答案对未来的访问者更有帮助。
# 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)
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}"))