ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅! ΠΡΡΠ²Π°ΡΠ° ΠΌΠΈ ΡΠ΅ΡΠΈΡ ΡΡΠ°ΡΠΈΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½Π° Π½Π° ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡ ΠΈ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ/Π·Π²ΡΡΠΈ, ΠΊΠ°ΡΠΎ 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
ΠΠ° Π΄Π° Π·Π°Π΅ΠΌΠ° ΡΠ°ΠΉΠ»Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΌΡΡΡΠΎ, ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΡΠΌΠ°ΡΠ°
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 Π±ΠΈΡΠΎΠ² Π·Π²ΡΠΊ)
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):
Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ΄ (WAV.py) (ΠΠΎΠ΄ΡΡ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΠ±Π»ΠΈΡΠ°Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅, ΡΠΎΠ²Π° Π΅ ΡΠ°ΠΌΠΎ Π½Π°Π±ΡΠΎΡΠΊΠ°):
ΠΎΡ struct import pack # ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ py-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Π±Π°Π·ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ ΠΈΠ· C
ΠΎΡ os import urandom # ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ /dev/urandom, Π΄Π»Ρ Windows:
# ΠΎΡ random import randint
# urandom = lambda sz: bytes([randint(0, 255) for _ in range(sz)]) # Π»ΡΠΌΠ±Π΄Π° Π΄Π»Ρ Windows, ΡΠ°ΠΊ ΠΊΠ°ΠΊ urandom Π² Windows ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ
ΠΎΡ sys import argv, exit # Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π²ΡΡ
ΠΎΠ΄
Π΅ΡΠ»ΠΈ len(argv) != 3: # +1 ΠΈΠΌΡ ΡΠΊΡΠΈΠΏΡΠ° (-1, Π΅ΡΠ»ΠΈ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ Π·Π°ΠΌΠΎΡΠ°ΠΆΠΈΠ²Π°ΡΡ)
print('ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅: python3 WAV.py [ΡΠΈΡΠ»ΠΎ ΠΎΠ±ΡΠ°Π·ΡΠΎΠ²] [Π²ΡΡ
ΠΎΠ΄]')
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 Π±ΠΈΡΠ° Π·Π²ΡΠΊ)
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) # ΡΠ°ΠΌ ΡΡΠΌ
Ρ open(output_path, 'wb') ΠΊΠ°ΠΊ fh:
fh.write(chunkId + chunkSize + Format + subchunk1ID +
subchunk1Size + audioFormat + numChannels +
sampleRate + byteRate + blockAlign + bitsPerSample +
subchunk2ID + subchunk2Size + data) # Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² ΡΠ°ΠΉΠ»Π Π΅Π·ΡΠΌΠ΅
Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΡΠ·Π½Π°Π»ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ ΡΠΈΡΡΠΎΠ²ΠΎΠΌ Π·Π²ΡΠΊΠ΅ ΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ
ΡΠ°Π½ΡΡ. Π ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΅ ΠΌΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΆΠ°ΡΠΈΠ΅ (audioFormat), Π½ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ
ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠΊΠΎΠ»ΠΎ 10 ΡΡΠ°ΡΠ΅ΠΉ. ΠΠ°Π΄Π΅ΡΡΡ, Π²Ρ ΡΠ·Π½Π°Π»ΠΈ ΡΡΠΎ-ΡΠΎ Π½ΠΎΠ²ΠΎΠ΅ Π΄Π»Ρ ΡΠ΅Π±Ρ ΠΈ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ Π² Π±ΡΠ΄ΡΡΠΈΡ
ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°Ρ
.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ!
ΠΠ·ΡΠΎΡΠ½ΠΈΡΠΈ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
