簡體   English   中英

使用 Moviepy Audiofile 將 mp4 中的音頻保存為 wav 文件

[英]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文件。


Audacity 中打開音頻文件

生成的文件sound.wav可以在 Audacity 中打開,但是當我嘗試將它用作帶有其他 Python 模塊的 wav 文件時遇到了問題。


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 根據文檔,發生這種情況時,該方法無法確定文件中存儲的聲音數據的類型。


使用 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

為什么音頻文件在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM