0
votes

Enregistrement audio de mp4 en tant que fichier wav à l'aide de Moviepy Audiofile

J'ai un fichier vidéo nommé 'video.mp4' . J'essaie de séparer une section audio de la vidéo et de l'enregistrer en tant que fichier wav pouvant être utilisé avec d'autres modules Python. Je veux faire cela avec MoviePy.

J'envoie des paramètres à la fonction write_audiofile , en spécifiant le nom de fichier, fps, nbyte et codec.

A la suite des MoviePy AudioClip docs , je spécifie le codec comme ‘pcm_s32le’ pour un fichier wav 32 bits.

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

Ce code génère un fichier .wav , nommé 'sound.wav' .


Ouverture du fichier audio dans Audacity

Le fichier résultant, sound.wav , peut être ouvert dans Audacity, mais je rencontre des problèmes lorsque j'essaye de l'utiliser comme fichier wav avec d'autres modules Python.


Lecture du fichier son dans pygame

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)

La troisième ligne donne l'erreur suivante:

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


Déterminer le type de fichier son à l'aide de sndhdr.what ()

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

La méthode sndhdr none renvoyé none . Selon la documentation , lorsque cela se produit, la méthode n'a pas réussi à déterminer le type de données sonores stockées dans le fichier.


Lire le fichier avec la reconnaissance vocale Google

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

Ce code arrête l'exécution sur l'avant-dernière ligne:

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

Pourquoi le fichier audio s'ouvre-t-il dans Audacity, si sndhdr.what() ne peut pas le reconnaître comme un type de fichier audio? Comment puis-je exporter correctement un MoviePy AudioClip en tant que fichier wav ?


0 commentaires

4 Réponses :


0
votes

J'ai eu le même problème. J'essayais d'obtenir un fichier mp4 à partir de l'URL, puis de le convertir en fichier wav et d'appeler Google Speech Recognition dessus. Au lieu de cela, j'ai utilisé pydub pour gérer la conversion et cela a fonctionné! Voici un exemple de code:

    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)

Notez que j'ai écrit deux fonctions: mp4_to_wav et mp4_to_wav_mem. La seule différence est que mp4_to_wav_mem gère tous les fichiers en mémoire et mp4_to_wav génère un fichier .wav.


0 commentaires

0
votes

J'ai lu la documentation de MoviePy et j'ai trouvé que le paramètre nbyte devrait être cohérent avec le codec . nbyte correspond à la largeur de l'échantillon (définie sur 2 pour un son 16 bits, 4 pour un son 32 bits). Par conséquent, il vaut mieux définir nbyte=4 , lorsque vous définissez codec=pcm_s32le .


0 commentaires

0
votes

J'ai eu le même problème sans codec spécifié ou avec codec = 'pcms32le', celui qui fonctionnait pour moi était pcm_s16le . Notez que j'utilise le langage "fr-FR", vous devriez probablement vous adapter à vos besoins. voici le code complet:

# 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)


0 commentaires

0
votes

je pense que c'est la bonne méthode:

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


1 commentaires

Bien que cet extrait de code puisse résoudre le problème, pensez à inclure une explication sur comment et pourquoi cela fonctionne pour rendre cette réponse plus utile pour les futurs visiteurs de la question.