(Python) Diviser et épisser des fichiers audio WAV en Python

Dans cet article, nous présenterons comment utiliser Python pour traiter des fichiers audio, en nous concentrant sur le fractionnement et l'épissage des fichiers wav.

1. Diviser les fichiers WAV

Le fractionnement de fichiers est une tâche de base pour le traitement audio. En Python, nous pouvons utiliser le module wave pour lire les fichiers .wav et le module signal dans SciPy pour la segmentation.

1.1. Lecture de fichiers WAV

En utilisant la fonction wave.open() pour ouvrir un fichier .wav, nous pouvons obtenir les informations de base du fichier, telles que le nombre de canaux, la fréquence d'échantillonnage, etc.

import wave

wf = wave.open("audio.wav", "rb")

# 获取音频文件基本信息
nchannels = wf.getnchannels()  # 声道数
sampwidth = wf.getsampwidth()  # 采样位宽
framerate = wf.getframerate()  # 采样率
nframes = wf.getnframes()      # 采样点数

1.2. Diviser les fichiers WAV

Nous pouvons diviser le fichier wav en définissant les numéros d'image de début et de fin. Le code suivant divise un fichier audio de 10 secondes en 5 fichiers d'une durée de 2 secondes.

import wave
import numpy as np
from scipy import signal

wf = wave.open("audio.wav", "rb")
nchannels = wf.getnchannels()
sampwidth = wf.getsampwidth()
framerate = wf.getframerate()
nframes = wf.getnframes()

duration = nframes / framerate
print("音频文件时长:%.2fs" % duration)

# 设置分割的长度为2s
length = 2 * framerate
start = 0

for i in range(5):
    # 截取片段
    wf.setpos(start)
    data = wf.readframes(length)

    # 保存为新文件
    new_wf = wave.open("segment_%d.wav" % i, "wb")
    new_wf.setnchannels(nchannels)
    new_wf.setsampwidth(sampwidth)
    new_wf.setframerate(framerate)
    new_wf.writeframes(data)
    new_wf.close()
    
    # 更新起始位置
    start += length

2. Épissage de fichiers WAV

En plus de diviser les fichiers, nous avons également besoin de la fonction de fusion des fichiers. En Python, nous pouvons également utiliser le module wave pour lire les fichiers wav et utiliser la fonction concaténer dans numpy pour l'épissage.

2.1. Lire plusieurs fichiers WAV

Utilisez la fonction wave.open() pour ouvrir plusieurs fichiers .wav, nous pouvons les lire en mémoire, puis utiliser la fonction concaténer dans numpy pour les séparer. Le code suivant fusionne cinq fichiers audio de 2 secondes en un fichier de 10 secondes.

import wave
import numpy as np

# 读取多个.wav文件
wfiles = []
for i in range(5):
    wfiles.append(wave.open("segment_%d.wav" % i, "rb"))

# 获取音频文件基本信息
nchannels = wfiles[0].getnchannels()
sampwidth = wfiles[0].getsampwidth()
framerate = wfiles[0].getframerate()

# 拼接为一个文件
data = np.array([])
for wf in wfiles:
    frames = wf.readframes(wf.getnframes())
    frames = np.frombuffer(frames, dtype=np.int16)
    data = np.append(data, frames)

# 保存为新文件
wf = wave.open("output.wav", "wb")
wf.setnchannels(nchannels)
wf.setsampwidth(sampwidth)
wf.setframerate(framerate)
wf.writeframes(data.tobytes())
wf.close()

Résumer:

Grâce au module wave et au module signal de SciPy, nous pouvons facilement diviser et assembler des fichiers .wav. Cela offrira une certaine commodité pour le traitement audio et l’analyse des données audio.

Guess you like

Origin blog.csdn.net/qq_40728667/article/details/133897029