Wave.open: примеры (PYTHON)
wave.open(file: str, mode: str): Wave_read/Wave_writeБазовая информация о функции wave.open
Функция wave.open() является частью стандартного модуля wave в Python и предназначена для работы с WAV файлами. Она используется для открытия аудиофайлов в формате WAV с целью чтения или записи.
Функция предоставляет интерфейс для доступа к аудиоданным и их параметрам, таким как количество каналов, частота дискретизации, глубина бит и количество сэмплов.
Аргументы функции
file- путь к файлу в виде строки или файловый объект.mode- режим открытия файла:'rb'для чтения,'wb'для записи.
Возвращаемое значение
Функция возвращает объект Wave_read при открытии в режиме чтения или Wave_write при открытии в режиме записи. Эти объекты предоставляют методы для работы с аудиоданными.
Примеры использования wave.open
Чтение WAV файла
import wave
with wave.open('audio.wav', 'rb') as wav_file:
params = wav_file.getparams()
print(params)(2, 2, 44100, 88200, 'NONE', 'not compressed')
Запись WAV файла
import wave
import numpy as np
sample_rate = 44100
duration = 2.0
t = np.linspace(0, duration, int(sample_rate * duration))
# Создание синусоидального сигнала 440 Гц
audio_data = (32767 * np.sin(2 * np.pi * 440 * t)).astype(np.int16)
with wave.open('output.wav', 'wb') as wav_file:
wav_file.setnchannels(1)
wav_file.setsampwidth(2)
wav_file.setframerate(sample_rate)
wav_file.writeframes(audio_data.tobytes())Файл output.wav успешно создан
Альтернативные библиотеки Python
soundfile- поддерживает множество форматов (WAV, FLAC, OGG), использует библиотеку libsndfile. Подходит для чтения и записи различных аудиоформатов.pydub- высокоуровневая библиотека для работы с аудио, упрощает манипуляции с аудиоданными. Использует wave и другие бэкенды.scipy.io.wavfile- предоставляет функцииreadиwriteдля работы с WAV файлами, возвращает данные в виде массивов NumPy.
Модуль wave применяется, когда требуется работа только с WAV файлами без дополнительных зависимостей.
Аналоги в других языках программирования
JavaScript (Web Audio API)
// Загрузка и декодирование WAV файла
async function loadWavFile(url) {
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
const audioContext = new AudioContext();
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
return audioBuffer;
}Java (javax.sound.sampled)
import javax.sound.sampled.*;
public class WavReader {
public static void main(String[] args) throws Exception {
AudioInputStream audioStream = AudioSystem.getAudioInputStream(
new File("audio.wav")
);
AudioFormat format = audioStream.getFormat();
System.out.println("Sample rate: " + format.getSampleRate());
}
}C# (NAudio библиотека)
using NAudio.Wave;
class Program {
static void Main() {
using (var reader = new WaveFileReader("audio.wav")) {
Console.WriteLine($"Channels: {reader.WaveFormat.Channels}");
Console.WriteLine($"Sample rate: {reader.WaveFormat.SampleRate}");
}
}
}Аналоги в других языках часто предоставляют более высокоуровневый интерфейс по сравнению с Python модулем wave.
Типичные ошибки
Неправильный режим открытия файла
import wave
# Попытка чтения в режиме записи
with wave.open('audio.wav', 'wb') as wav_file:
params = wav_file.getparams()Error: wave.Error: file does not start with RIFF id
Некорректные параметры при записи
import wave
with wave.open('output.wav', 'wb') as wav_file:
# Пропущен вызов setnchannels
wav_file.setsampwidth(2)
wav_file.setframerate(44100)
wav_file.writeframes(b'')Error: wave.Error: nchannels not set
Чтение несуществующего файла
import wave
with wave.open('nonexistent.wav', 'rb') as wav_file:
passError: FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.wav'
Изменения в последних версиях Python
Модуль wave остается стабильным в последних версиях Python. Значительных изменений в функции wave.open() не происходило с Python 3. Основные изменения касались внутренних улучшений и поддержки контекстных менеджеров.
В Python 3.4 была улучшена поддержка файловых объектов, а в Python 3.8 добавлены улучшения обработки ошибок. Интерфейс функции остается обратно совместимым.
Расширенные примеры использования
Извлечение метаданных WAV файла
import wave
def get_wav_metadata(filename):
with wave.open(filename, 'rb') as wav_file:
metadata = {
'channels': wav_file.getnchannels(),
'sample_width': wav_file.getsampwidth(),
'frame_rate': wav_file.getframerate(),
'frames': wav_file.getnframes(),
'compression': wav_file.getcomptype(),
'compression_name': wav_file.getcompname(),
'duration': wav_file.getnframes() / wav_file.getframerate()
}
return metadata
metadata = get_wav_metadata('audio.wav')
for key, value in metadata.items():
print(f'{key}: {value}')channels: 2 sample_width: 2 frame_rate: 44100 frames: 88200 compression: NONE compression_name: not compressed duration: 2.0
Конвертация стерео в моно
import wave
import struct
def stereo_to_mono(input_file, output_file):
with wave.open(input_file, 'rb') as wav_in:
params = wav_in.getparams()
if params.nchannels != 2:
raise ValueError("Файл должен быть стерео")
frames = wav_in.readframes(params.nframes)
# Преобразование стерео в моно (усреднение каналов)
mono_frames = bytearray()
for i in range(0, len(frames), params.sampwidth * 2):
left = struct.unpack('Файл mono.wav успешно создан
Изменение частоты дискретизации
import wave
import audioop
def change_sample_rate(input_file, output_file, new_rate):
with wave.open(input_file, 'rb') as wav_in:
params = wav_in.getparams()
frames = wav_in.readframes(params.nframes)
# Изменение частоты дискретизации
converted_frames = audioop.ratecv(
frames,
params.sampwidth,
params.nchannels,
params.framerate,
new_rate,
None
)[0]
with wave.open(output_file, 'wb') as wav_out:
wav_out.setparams((params.nchannels, params.sampwidth,
new_rate, 0, params.comptype,
params.compname))
wav_out.writeframes(converted_frames)
change_sample_rate('input.wav', 'output_22050.wav', 22050)Файл output_22050.wav создан с частотой 22050 Гц
Создание WAV файла с тишиной
import wave
def create_silent_wav(filename, duration_seconds=5.0,
sample_rate=44100, channels=2):
num_frames = int(sample_rate * duration_seconds)
silent_data = b'\x00' * (num_frames * channels * 2)
with wave.open(filename, 'wb') as wav_file:
wav_file.setnchannels(channels)
wav_file.setsampwidth(2)
wav_file.setframerate(sample_rate)
wav_file.writeframes(silent_data)
create_silent_wav('silence.wav', duration_seconds=3.0)Файл silence.wav создан (3 секунды тишины)