ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° компрСсиранС/ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΈ Π΄Π°Π½Π½ΠΈ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ WAVE ΠΈ JPEG, част 1

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅! ΠŸΡŠΡ€Π²Π°Ρ‚Π° ΠΌΠΈ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π° ΠΎΡ‚ статии Ρ‰Π΅ сС ΡΡŠΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈ Π²ΡŠΡ€Ρ…Ρƒ ΠΈΠ·ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° компрСсия Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅/Π°ΡƒΠ΄ΠΈΠΎ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚ΠΎ JPEG (ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅) ΠΈ WAVE (Π·Π²ΡƒΠΊ) ΠΈ Ρ‰Π΅ Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΡΡŠΡ‰ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ Ρ‚Π΅Π·ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ (.jpg, .wav) Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π’ Ρ‚Π°Π·ΠΈ част Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ WAVE.

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

WAVE (Waveform Audio File Format) Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° запис Π½Π° Π°ΡƒΠ΄ΠΈΠΎ ΠΏΠΎΡ‚ΠΎΠΊ. Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° нСкомпрСсирано Π°ΡƒΠ΄ΠΈΠΎ, ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ€Π°Π½ΠΎ с импулсСн ΠΊΠΎΠ΄. (Π’Π·Π΅Ρ‚ΠΎ ΠΎΡ‚ Wikipedia)

Π’ΠΎΠΉ Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ ΠΏΡ€Π΅Π· 1991 Π³. Π·Π°Π΅Π΄Π½ΠΎ с RIFF ΠΎΡ‚ Microsoft ΠΈ IBM (Π²ΠΎΠ΄Π΅Ρ‰ΠΈ ИВ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΏΠΎ Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅).

Π€Π°ΠΉΠ»ΠΎΠ²Π° структура

Π€Π°ΠΉΠ»ΡŠΡ‚ ΠΈΠΌΠ° Π·Π°Π³Π»Π°Π²Π½Π° част, самитС Π΄Π°Π½Π½ΠΈ, Π½ΠΎ няма Π΄ΠΎΠ»Π΅Π½ ΠΊΠΎΠ»ΠΎΠ½Ρ‚ΠΈΡ‚ΡƒΠ». Π₯Π΅Π΄ΡŠΡ€ΡŠΡ‚ Ρ‚Π΅ΠΆΠΈ ΠΎΠ±Ρ‰ΠΎ 44 Π±Π°ΠΉΡ‚Π°.
Π—Π°Π³Π»Π°Π²ΠΈΠ΅Ρ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° настройки Π·Π° броя Π½Π° Π±ΠΈΡ‚ΠΎΠ²Π΅Ρ‚Π΅ Π² сСмпла, чСстота Π½Π° сСмплиранС, Π΄ΡŠΠ»Π±ΠΎΡ‡ΠΈΠ½Π° Π½Π° Π·Π²ΡƒΠΊΠ° ΠΈ Π΄Ρ€. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° информация Π·Π° Π·Π²ΡƒΠΊΠΎΠ²Π°Ρ‚Π° ΠΊΠ°Ρ€Ρ‚Π°. (Всички числови стойности Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ записани Π² Little-Endian Ρ€Π΅Π΄)

ИмС на блока
Π Π°Π·ΠΌΠ΅Ρ€ Π½Π° Π±Π»ΠΎΠΊΠ° (B)
ОписаниС/ЦСл
Бтойност (Π·Π° някои Π΅ фиксирана

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

chunkSize
4
Π Π°Π·ΠΌΠ΅Ρ€ Π½Π° цСлия Ρ„Π°ΠΉΠ» Π±Π΅Π· chunkId ΠΈ chunkSize
FILE_SIZE - 8

Ρ„ΠΎΡ€ΠΌΠ°Ρ‚
4
ДСфиниция Π½Π° Ρ‚ΠΈΠΏΠ° ΠΎΡ‚ RIFF
0x57415645 Π² Big-Endian (β€žWAVEβ€œ)

subchunk1Id
4
Π’Π°ΠΊΠ° Ρ‡Π΅ Ρ„Π°ΠΉΠ»ΡŠΡ‚ Π΄Π° Π·Π°Π΅ΠΌΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅ място ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°
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 XNUMX (Π½Π°ΠΉ-ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎΡ‚ΠΎ качСство Π½Π° Π·Π²ΡƒΠΊΠ°)

byteRate
4
Π‘Ρ€ΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ Π² сСкунда
sampleRate numChannels bitsPerSample (ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ)

blockAlign
2
Π‘Ρ€ΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ Π·Π° 1 ΠΏΡ€ΠΎΠ±Π°
numChannels * bitsPerSample: 8

bitsPerSample
2
Π‘Ρ€ΠΎΠΉ Π±ΠΈΡ‚ΠΎΠ²Π΅ Π½Π° 1 ΠΏΡ€ΠΎΠ±Π° (Π΄ΡŠΠ»Π±ΠΎΡ‡ΠΈΠ½Π°)
Всяко число, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ ΠΊΡ€Π°Ρ‚Π½ΠΎ Π½Π° 8. ΠšΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΏΠΎ-високо Π΅ числото, Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΠΎ-Π΄ΠΎΠ±Ρ€ΠΎ ΠΈ ΠΏΠΎ-Ρ‚Π΅ΠΆΠΊΠΎ Ρ‰Π΅ бъдС Π°ΡƒΠ΄ΠΈΠΎΡ‚ΠΎ; ΠΎΡ‚ 32 Π±ΠΈΡ‚Π° няма Ρ€Π°Π·Π»ΠΈΠΊΠ° Π·Π° Ρ…ΠΎΡ€Π°Ρ‚Π°

subchunk2Id
4
Π Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π΅Π½ Π·Π½Π°ΠΊ Π·Π° Π΄Π°Π½Π½ΠΈ (Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π΄Ρ€ΡƒΠ³ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π½Π° Π·Π°Π³Π»Π°Π²ΠΊΠ°Ρ‚Π° Π² зависимост ΠΎΡ‚ Π°ΡƒΠ΄ΠΈΠΎΡ„ΠΎΡ€ΠΌΠ°Ρ‚Π°)
0x64617461 Π² Big-Endian("Π΄Π°Π½Π½ΠΈ")

subchunk2Size
4
Π Π°Π·ΠΌΠ΅Ρ€ Π½Π° областта Π·Π° Π΄Π°Π½Π½ΠΈ
Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² int

Π΄Π°Π½Π½ΠΈ
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]
Π±Ρ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±ΠΈ - Π±Ρ€. ΠΏΡ€ΠΎΠ±ΠΈ
ΠΈΠ·Ρ…ΠΎΠ΄ β€” ΠΏΡŠΡ‚ към изходния Ρ„Π°ΠΉΠ»

Π•Ρ‚ΠΎ Π²Ρ€ΡŠΠ·ΠΊΠ° към тСстов Π°ΡƒΠ΄ΠΈΠΎ Ρ„Π°ΠΉΠ» с ΡˆΡƒΠΌ, Π½ΠΎ Π·Π° Π΄Π° спСстя ΠΏΠ°ΠΌΠ΅Ρ‚, Π½Π°ΠΌΠ°Π»ΠΈΡ… 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 - УикипСдия

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€