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'
.
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.
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'
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.
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
?
4 Réponses :
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.
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
.
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)
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}"))
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.