Wave.open: примеры (PYTHON)

Работа с WAV файлами в Python через модуль wave
Раздел: Аудио, Файлы
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:
    pass
Error: FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.wav'

Изменения в последних версиях Python

Модуль wave остается стабильным в последних версиях Python. Значительных изменений в функции wave.open() не происходило с Python 3. Основные изменения касались внутренних улучшений и поддержки контекстных менеджеров.

В Python 3.4 была улучшена поддержка файловых объектов, а в Python 3.8 добавлены улучшения обработки ошибок. Интерфейс функции остается обратно совместимым.

Расширенные примеры использования

Извлечение метаданных WAV файла

Пример python
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

Конвертация стерео в моно

Пример python
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 успешно создан

Изменение частоты дискретизации

Пример python
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 файла с тишиной

Пример python
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 секунды тишины)

питон wave.open function comments

En
Wave.open Open WAV file