ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅! ΠΡΡΠ²Π°ΡΠ° ΠΌΠΈ ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ° ΠΎΡ ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ ΡΠ΅ ΡΡΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈ Π²ΡΡΡ Ρ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅/Π°ΡΠ΄ΠΈΠΎ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ Π·Π° ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ 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):
Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ΄ (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 ΡΡΠ°ΡΠΈΠΈ.ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅, ΡΠ΅ ΡΡΠ΅ Π½Π°ΡΡΠΈΠ»ΠΈ Π½Π΅ΡΠΎ Π½ΠΎΠ²ΠΎ Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ ΠΈ ΡΠΎΠ²Π° ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π² Π±ΡΠ΄Π΅ΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΠΈ!
ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com