[英]I am trying to convert an video mp4 file to Audio mp3 format by using MoviePy module but it is showing me Nonetype error
[英]Saving audio from mp4 as wav file using Moviepy Audiofile
我有一個名為'video.mp4'
的視頻文件。 我試圖從視頻中分離出一段音頻並將其保存為可與其他 Python 模塊一起使用的 wav 文件。 我想用 MoviePy 做到這一點。
我向write_audiofile
函數發送參數,指定文件名、fps、nbyte 和編解碼器。
按照 MoviePy AudioClip docs ,我將 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 中打開,但是當我嘗試將它用作帶有其他 Python 模塊的 wav 文件時遇到了問題。
import pygame
pygame.mixer.init()
sound=pygame.mixer.Sound("sound.wav")
第三行給出了以下錯誤:
pygame.error: Unable to open file 'sound.wav'
import sndhdr
sndhdr.what("sound.wav")
sndhdr 方法返回none
。 根據文檔,發生這種情況時,該方法無法確定文件中存儲的聲音數據的類型。
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
為什么音頻文件在 Audacity 中打開,如果sndhdr.what()
無法將其識別為音頻文件類型? 如何將 MoviePy AudioClip 正確導出為wav
文件?
我遇到了同樣的問題,沒有指定編解碼器或編解碼器 = 'pcm32le',對我有用的是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)
我遇到過同樣的問題。 我試圖從 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 文件。
我閱讀了 MoviePy 的文檔,發現參數nbyte
應該與codec
一致。 nbyte
用於樣本寬度(16 位聲音設置為 2,32 位聲音設置為 4)。 因此,最好在設置codec=pcm_s32le
時設置nbyte=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}"))
我認為這種方法很容易理解。
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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.