ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ сТатия/хранСния ΠΌΠ΅Π΄ΠΈΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… WAVE ΠΈ JPEG, Ρ‡Π°ΡΡ‚ΡŒ 1

ЗдравствуйтС! Моя пСрвая сСрия статСй Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π° Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сТатия ΠΈ хранСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ/Π·Π²ΡƒΠΊΠ°, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ JPEG (ΠΈΠ·ΠΎΠ±Ρ€.) ΠΈ WAVE (Π·Π²ΡƒΠΊ), Ρ‚Π°ΠΊΠΆΠ΅ Π² Π½ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с использованиСм этих Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² (.jpg, .wav) Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’ этой части ΠΌΡ‹ рассмотрим ΠΈΠΌΠ΅Π½Π½ΠΎ WAVE.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ

WAVE (Waveform Audio File Format) β€” Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ„Π°ΠΉΠ»Π°-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° для хранСния записи Π°ΡƒΠ΄ΠΈΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния нСсТатого Π·Π²ΡƒΠΊΠ° Π² ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ½ΠΎ-ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ модуляции. (Взято ΠΈΠ· Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ)

Он Π±Ρ‹Π» ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π² 1991 Π³ΠΎΠ΄Ρƒ вмСстС с RIFF компаниями Microsoft ΠΈ IBM (Π’Π΅Π΄ΡƒΡ‰ΠΈΠ΅ IT ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ).

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ„Π°ΠΉΠ»Π°

Π£ Ρ„Π°ΠΉΠ»Π° Π΅ΡΡ‚ΡŒ заголовочная Ρ‡Π°ΡΡ‚ΡŒ, сами Π΄Π°Π½Π½Ρ‹Π΅, Π½ΠΎ Π½Π΅Ρ‚ Ρ„ΡƒΡ‚Π΅Ρ€Π°. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ вСсит Π² ΠΎΠ±Ρ‰Π΅ΠΌ 44 Π±Π°ΠΉΡ‚Π°.
Π’ Ρ…Π΅Π΄Π΅Ρ€Π΅ находятся настройки количСства Π±ΠΈΡ‚ Π² сСмплС, частоты дСскритизации, Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ Π·Π²ΡƒΠΊΠ° ΠΈ Ρ‚.ΠΏ. ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ для Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹. (ВсС числовыС значСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ записаны Π² Little-Endian порядкС)

Имя блока
Π Π°Π·ΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° (B)
ОписаниС/ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΎ фиксировано

chunkId
4
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° ΠΊΠ°ΠΊ ΠΌΠ΅Π΄ΠΈΠ°-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€
0x52494646 Π² Big-Endian («RIFF»)

chunkSize
4
Π Π°Π·ΠΌΠ΅Ρ€ всСго Ρ„Π°ΠΉΠ»Π° Π±Π΅Π· chunkId ΠΈ chunkSize
FILE_SIZE β€” 8

format
4
ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΈΠ· RIFF
0x57415645 Π² Big-Endian («WAVE»)

subchunk1Id
4
Π§Ρ‚ΠΎΠ±Ρ‹ Ρ„Π°ΠΉΠ» побольшС мСста Π·Π°Π½ΠΈΠΌΠ°Π» ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ format’Π°
0x666d7420 Π² Big-Endian («fmt «)

subchunk1Size
4
ΠžΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ Ρ…Π΅Π΄Π΅Ρ€ (Π² Π±Π°ΠΉΡ‚Π°Ρ…)
16 ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (для случая Π±Π΅Π· сТатия Π°ΡƒΠ΄ΠΈΠΎΠΏΠΎΡ‚ΠΎΠΊΠ°)

audioFormat
2
Аудио Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (зависит ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сТатия ΠΈ структуры Π°ΡƒΠ΄ΠΈΠΎΠ΄Π°Π½Π½Ρ‹Ρ…)
1 (для PCM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈ рассматриваСм)

numChannels
2
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠ°Π½Π°Π»ΠΎΠ²
1/2, ΠΌΡ‹ возьмСм 1 ΠΊΠ°Π½Π°Π» (3/4/5/6/7… β€” спСцифичСская Π°ΡƒΠ΄ΠΈΠΎΠ΄ΠΎΡ€ΠΎΠΆΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 4 для ΠΊΠ²Π°Π΄Ρ€ΠΎ Π·Π²ΡƒΠΊΠ° ΠΈ Ρ‚.ΠΏ.)

sampleRate
4
Частота сСмплирования Π·Π²ΡƒΠΊΠ° (Π² Π“Π΅Ρ€Ρ†Π°Ρ…)
Π§Π΅ΠΌ большС, Ρ‚Π΅ΠΌ качСствСннСС Π±ΡƒΠ΄Π΅Ρ‚ Π·Π²ΡƒΠΊ, Π½ΠΎ Ρ‚Π΅ΠΌ большС потрСбуСтся памяти для создания Π°ΡƒΠ΄ΠΈΠΎΠ΄ΠΎΡ€ΠΎΠΆΠΊΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄Π»ΠΈΠ½Ρ‹, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” 48000 (Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ΅ качСство Π·Π²ΡƒΠΊΠ°)

byteRate
4
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π±Π°ΠΉΡ‚ Π·Π° 1 сСкунду
sampleRate numChannels bitsPerSample (Π΄Π°Π»Π΅Π΅)

blockAlign
2
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π±Π°ΠΉΡ‚ для 1 сСмпла
numChannels * bitsPerSample: 8

bitsPerSample
2
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π±ΠΈΡ‚ Π·Π° 1 сСмпл (Π³Π»ΡƒΠ±ΠΈΠ½Π°)
Π›ΡŽΠ±ΠΎΠ΅ число, ΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ 8. Π§Π΅ΠΌ большС, Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈ тяТСлСС Π±ΡƒΠ΄Π΅Ρ‚ Π°ΡƒΠ΄ΠΈΠΎ, ΠΎΡ‚ 32 Π±ΠΈΡ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π½Π΅Ρ‚ для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°

subchunk2Id
4
ΠœΠ΅Ρ‚ΠΊΠ° отсчСта Π½Π°Ρ‡Π°Π»Π° Π΄Π°Π½Π½Ρ‹Ρ… (Ρ‚.ΠΊ. ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты Ρ…Π΅Π΄Π΅Ρ€Π° Π² зависимости ΠΎΡ‚ audioFormat)
0x64617461 Π² Big-Endian («data»)

subchunk2Size
4
Π Π°Π·ΠΌΠ΅Ρ€ области Π΄Π°Π½Π½Ρ‹Ρ…
Ρ€Π°Π·ΠΌΠ΅Ρ€ data Π² int’Π΅

data
byteRate * ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π°ΡƒΠ΄ΠΈΠΎ
АудиоданныС
?

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с WAVE

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΌΠΎΠΆΠ½ΠΎ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ пСрСвСсти Π² структуру Π½Π° C, Π½ΠΎ наш язык Π½Π° сСгодня β€” Python. Π‘Π°ΠΌΠΎΠ΅ Π»Π΅Π³ΠΊΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ «Π²ΠΎΠ»Π½Ρƒ» β€” Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΡˆΡƒΠΌΠ°. Для этой Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ высокий byteRate ΠΈ сТатиС.
Для Π½Π°Ρ‡Π°Π»Π° ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ:

# WAV.py

from struct import pack  # ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ py-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· C
from os import urandom  # функция для чтСния /dev/urandom, для windows:
# from random import randint
# urandom = lambda sz: bytes([randint(0, 255) for _ in range(sz)])  # лямбда ΠΏΠΎΠ΄ windows, Ρ‚.ΠΊ. urandom'Π° Π² Π²ΠΈΠ½Π΄Π΅ Π½Π΅Ρ‚
from sys import argv, exit  # Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊ ΠΏΡ€ΠΎΠ³Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄

if len(argv) != 3:  # +1 имя скрипта (-1, Ссли Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ)
    print('Usage: python3 WAV.py [num of samples] [output]')
    exit(1)

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌ. НСпостоянныС Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ Π² Π½Π΅ΠΉ зависят Ρ‚ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ numSamples (количСство сСмплов). Π§Π΅ΠΌ большС ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚Π΅ΠΌ дольшС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ наш ΡˆΡƒΠΌ.

numSamples = int(argv[1])
output_path = argv[2]

chunkId = b'RIFF'
Format = b'WAVE'
subchunk1ID = b'fmt '
subchunk1Size = b'x10x00x00x00'  # 0d16
audioFormat = b'x01x00'
numChannels = b'x02x00'  # 2-Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ достаточно (стСрСо)
sampleRate = pack('<L', 1000)  # 1000 Ρ…Π²Π°Ρ‚ΠΈΡ‚, Π½ΠΎ Ссли ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ большС, Ρ‚ΠΎ ΡˆΡƒΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Ρ‹ΡˆΠ΅Π½ Π»ΡƒΡ‡ΡˆΠ΅. Π‘ 1000-ю ΠΎΠ½ Π·Π²ΡƒΡ‡ΠΈΡ‚, ΠΊΠ°ΠΊ Π²Π΅Ρ‚Π΅Ρ€
bitsPerSample = b'x20x00'  # 0d32
byteRate = pack('<L', 1000 * 2 * 4)  # sampleRate * numChannels * bitsPerSample / 8  (32 bit sound)
blockAlign = b'x08x00'  # numChannels * BPS / 8
subchunk2ID = b'data'
subchunk2Size = pack('<L', numSamples * 2 * 4)  # * numChannels * BPS / 8
chunkSize = pack('<L', 36 + numSamples * 2 * 4)  # 36 + subchunk2Size

data = urandom(1000 * 2 * 4 * numSamples)  # сам ΡˆΡƒΠΌ

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ лишь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… Π² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (ΠΊΠ°ΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅):

with open(output_path, 'wb') as fh:
    fh.write(chunkId + chunkSize + Format + subchunk1ID +
            subchunk1Size + audioFormat + numChannels + 
            sampleRate + byteRate + blockAlign + bitsPerSample +
            subchunk2ID + subchunk2Size + data)  # записываСм

И Ρ‚Π°ΠΊ, Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Для использования скрипта, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:
python3 WAV.py [num of samples] [output]
num of samples β€” ΠΊΠΎΠ». сСмплов
output β€” ΠΏΡƒΡ‚ΡŒ ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ

Π’ΠΎΡ‚ ссылка Π½Π° тСстовый Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ» с ΡˆΡƒΠΌΠΎΠΌ, Π½ΠΎ для экономии памяти я снизил BPS Π΄ΠΎ 1b/s ΠΈ количСство ΠΊΠ°Π½Π°Π»ΠΎΠ² опустил Π΄ΠΎ 1 (с 32 Π±ΠΈΡ‚Π½Ρ‹ΠΌ нСсТатым стСрСо Π°ΡƒΠ΄ΠΈΠΎΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π² 64kbs ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ 80M чистого .wav Ρ„Π°ΠΉΠ»Π°, Π° Ρ‚Π°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 10): https://instaud.io/3Dcy

Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ (WAV.py) (Код ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π½Ρ‹Ρ…, это лишь набросок):

from struct import pack  # ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ py-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· C
from os import urandom  # функция для чтСния /dev/urandom, для windows:
# from random import randint
# urandom = lambda sz: bytes([randint(0, 255) for _ in range(sz)])  # лямбда ΠΏΠΎΠ΄ windows, Ρ‚.ΠΊ. urandom'Π° Π² Π²ΠΈΠ½Π΄Π΅ Π½Π΅Ρ‚
from sys import argv, exit  # Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊ ΠΏΡ€ΠΎΠ³Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄

if len(argv) != 3:  # +1 имя скрипта (-1, Ссли Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ)
    print('Usage: python3 WAV.py [num of samples] [output]')
    exit(1)

numSamples = int(argv[1])
output_path = argv[2]

chunkId = b'RIFF'
Format = b'WAVE'
subchunk1ID = b'fmt '
subchunk1Size = b'x10x00x00x00'  # 0d16
audioFormat = b'x01x00'
numChannels = b'x02x00'  # 2-Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ достаточно (стСрСо) 
sampleRate = pack('<L', 1000)  # 1000 Ρ…Π²Π°Ρ‚ΠΈΡ‚, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ большС.
bitsPerSample = b'x20x00'  # 0d32
byteRate = pack('<L', 1000 * 2 * 4)  # sampleRate * numChannels * bitsPerSample / 8  (32 bit sound)
blockAlign = b'x08x00'  # numChannels * BPS / 8
subchunk2ID = b'data'
subchunk2Size = pack('<L', numSamples * 2 * 4)  # * numChannels * BPS / 8
chunkSize = pack('<L', 36 + numSamples * 2 * 4)  # 36 + subchunk2Size

data = urandom(1000 * 2 * 4 * numSamples)  # сам ΡˆΡƒΠΌ

with open(output_path, 'wb') as fh:
    fh.write(chunkId + chunkSize + Format + subchunk1ID +
            subchunk1Size + audioFormat + numChannels + 
            sampleRate + byteRate + blockAlign + bitsPerSample +
            subchunk2ID + subchunk2Size + data)  # записываСм Π² Ρ„Π°ΠΉΠ» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Π˜Ρ‚ΠΎΠ³

Π’ΠΎΡ‚ Π²Ρ‹ ΠΈ ΡƒΠ·Π½Π°Π»ΠΈ Ρ‡ΡƒΡ‚ΡŒ побольшС ΠΎ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΌ Π·Π²ΡƒΠΊΠ΅ ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ хранят. Π’ этом постС ΠΌΡ‹ Π½Π΅ использовали сТатия (audioFormat), Π½ΠΎ для рассмотра ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· популярных потрСбуСтся статСй 10. НадСюсь Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅ для сСбя ΠΈ это Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ….
Бпасибо!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° WAV Ρ„Π°ΠΉΠ»Π°
WAV β€” ВикипСдия

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ