ืžืขื˜ื”ืึธื“ืก ืคึฟืึทืจ ืงืึทืžืคึผืจืขืกื™ื ื’ / ืกื˜ืึธืจื™ื ื’ ืžืขื“ื™ืข ื“ืึทื˜ืŸ ืื™ืŸ WAVE ืื•ืŸ JPEG ืคึฟืึธืจืžืึทื˜ื™ืจื•ื ื’ืขืŸ, ื˜ื™ื™ืœ 1

ื”ืขืœื! ืžื™ื™ึทืŸ ืขืจืฉื˜ืขืจ ืกืขืจื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ืึทืจื˜ื™ืงืœืขืŸ ื•ื•ืขื˜ ืคืึธืงื•ืก ืื•ื™ืฃ ืœืขืจื ืขืŸ ื‘ื™ืœื“ / ืึทื•ื“ื™ืึธ ืงืึทืžืคึผืจืขืฉืึทืŸ ืื•ืŸ ืกื˜ืึธืจื™ื“ื–ืฉ ืžืขื˜ื”ืึธื“ืก ืึทื–ืึท ื•ื•ื™ ื“ื–ืฉืคึผืขื’ (ื‘ื™ืœื“) ืื•ืŸ ื•ื•ืึทื•ื•ืข (ื’ืขื–ื•ื ื˜), ืื•ืŸ ื•ื•ืขื˜ ืื•ื™ืš ืึทืจื™ื™ึทื ื ืขืžืขืŸ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ืžื’ื™ืœื” ื ื™ืฆืŸ ื“ื™ ืคึฟืึธืจืžืึทื˜ื™ืจื•ื ื’ืขืŸ (.ื“ื–ืฉืคึผื’, .ื•ื•ืึทื•ื•) ืื™ืŸ ืคื™ืจ. ืื™ืŸ ื“ืขื ื˜ื™ื™ืœ ืžื™ืจ ื•ื•ืขืœืŸ ืงื•ืงืŸ ืื™ืŸ WAVE.

ื’ืขืฉื™ื›ื˜ืข

WAVE (Waveform Audio File Format) ืื™ื– ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ื˜ืขืงืข ืคึฟืึธืจืžืึทื˜ ืคึฟืึทืจ ืกื˜ืึธืจื™ื ื’ ืึท ืจืขืงืึธืจื“ื™ื ื’ ืคื•ืŸ ืึทืŸ ืึทื•ื“ื™ืึธ ื˜ื™ื™ึทืš. ื“ืขื ืงืึทื ื˜ื™ื™ื ืขืจ ืื™ื– ื˜ื™ืคึผื™ืงืœื™ ื’ืขื ื™ืฆื˜ ืฆื• ืงืจืึธื ื•ื ืงืึธืžืคึผืจืขืกืกืขื“ ื“ื•ื™ืคืขืง ืงืึธื“ ืžืึทื“ื–ืฉืึทืœื™ื™ื˜ื™ื“ ืึทื•ื“ื™ืึธ. (ื’ืขื ื•ืžืขืŸ ืคื•ืŸ ื•ื•ื™ืงื™ืคืขื“ื™ืข)

ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื™ื ื•ื•ืขื ื˜ืึทื“ ืื•ืŸ ืืจื•ื™ืก ืื™ืŸ 1991 ืฆื•ื–ืึทืžืขืŸ ืžื™ื˜ RIFF ื“ื•ืจืš ืžื™ื™ืงืจืึธืกืึธืคึฟื˜ ืื•ืŸ ื™ื‘ื (ืœื™ื“ื™ื ื’ ืขืก ืงืึธืžืคึผืึทื ื™ืขืก ืคื•ืŸ ื“ืขืจ ืฆื™ื™ื˜).

ื˜ืขืงืข ืกื˜ืจื•ืงื˜ื•ืจ

ื“ืขืจ ื˜ืขืงืข ื”ืื˜ ืึท ื›ืขื“ืขืจ ื˜ื™ื™ืœ, ื“ื™ ื“ืึทื˜ืŸ ื–ื™ืš, ืึธื‘ืขืจ ืงื™ื™ืŸ ืคื•ื˜ืขืจ. ื“ื™ ื›ืขื“ืขืจ ื•ื•ื™ื™ื– ืึท ื’ืึทื ืฅ ืคื•ืŸ 44 ื‘ื™ื˜ืขืก.
ื“ืขืจ ื›ืขื“ืขืจ ื›ึผื•ืœืœ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื‘ื™ื˜ืŸ ืื™ืŸ ื“ืขืจ ืžื•ืกื˜ืขืจ, ืžื•ืกื˜ืขืจ ืงื•ืจืก, ื’ืขื–ื•ื ื˜ ื˜ื™ืคืงื™ื™ึทื˜, ืขื˜ืง. ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื“ืืจืฃ ืคึฟืึทืจ ื“ื™ ื’ืขื–ื•ื ื˜ ืงืึธืจื˜. (ืึทืœืข ื ื•ืžืขืจื™ืง ื˜ืึทื‘ืœืข ื•ื•ืึทืœื•ืขืก ืžื•ื–ืŸ ื–ื™ื™ืŸ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืงืœื™ื™ืŸ-ืขื ื“ื™ืึทืŸ ืกื“ืจ)

ื‘ืœืึธืง ื ืึธืžืขืŸ
ื‘ืœืึธืง ื’ืจื™ื™ืก (ื‘)
ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ / ืฆื™ืœ
ื•ื•ืขืจื˜ (ืคึฟืึทืจ ืขื˜ืœืขื›ืข ืขืก ืื™ื– ืคืึทืจืคืขืกื˜ื™ืงื˜

ื˜ืฉื•ื ืงื™ื™ื“
4
ื“ืขืคื™ื ื™ืจืŸ ืึท ื˜ืขืงืข ื•ื•ื™ ืึท ืžื™ื“ื™ืึท ืงืึทื ื˜ื™ื™ื ืขืจ
0x52494646 ืื™ืŸ ื‘ื™ื’-ืขื ื“ื™ืึทืŸ ("RIFF")

chunkSize
4
ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขืจ ื’ืื ืฆืขืจ ื˜ืขืงืข ืึธืŸ ื˜ืฉื•ื ืงื“ ืื•ืŸ ื˜ืฉื•ื ืงืกื™ื–ืข
FILE_SIZE - 8

ืคึฟืึธืจืžืึทื˜
4
ื˜ื™ืคึผ ื“ืขืคึฟื™ื ื™ืฆื™ืข ืคึฟื•ืŸ RIFF
0x57415645 ืื™ืŸ ื‘ื™ื’-ืขื ื“ื™ืึทืŸ ("WAVE")

subchunk1Id
4
ืึทื–ื•ื™ ืึทื– ื“ื™ ื˜ืขืงืข ื ืขืžื˜ ืžืขืจ ืคึผืœืึทืฅ ื“ื•ืจืš ืงืึทื ื˜ื™ื ื™ื•ื™ื ื’ ื“ืขื ืคึฟืึธืจืžืึทื˜
0x666d7420 ืื™ืŸ ื‘ื™ื’-ืขื ื“ื™ืึทืŸ ("ืคืžื˜")

ืกื•ื‘ื˜ืฉื•ื ืง1 ื’ืจื™ื™ืก
4
ืจื•ืขืŸ ื›ืขื“ืขืจ (ืื™ืŸ ื‘ื™ื˜ืขืก)
16 ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ (ืคึฟืึทืจ ื“ืขื ืคืึทืœ ืึธืŸ ืึทื•ื“ื™ืึธ ื˜ื™ื™ึทืš ืงืึทืžืคึผืจืขืฉืึทืŸ)

ืึทื•ื“ื™ืึธืคืึธืจืžืึทื˜
2
ืึทื•ื“ื™ืึธ ืคึฟืึธืจืžืึทื˜ (ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ ืงืึทืžืคึผืจืขืฉืึทืŸ ืื•ืคึฟืŸ ืื•ืŸ ืึทื•ื“ื™ืึธ ื“ืึทื˜ืŸ ืกื˜ืจื•ืงื˜ื•ืจ)
1 (ืคึฟืึทืจ PCM, ื•ื•ืึธืก ืื™ื– ื•ื•ืึธืก ืžื™ืจ ื‘ืึทื˜ืจืึทื›ื˜ืŸ)

numChannels
2
ื ื•ืžืขืจ ืคื•ืŸ ื˜ืฉืึทื ืึทืœื–
1/2, ืžื™ืจ ื•ื•ืขืœืŸ ื ืขืžืขืŸ 1 ืงืึทื ืึทืœ (3/4/5/6/7 ... - ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืึทื•ื“ื™ืึธ ืฉืคึผื•ืจ, ืœืžืฉืœ 4 ืคึฟืึทืจ ืงื•ื•ืึทื“ ืึทื•ื“ื™ืึธ, ืืื–"ื• ื•)

sampleRate
4
ืึทื•ื“ื™ืึธ ืžื•ืกื˜ืขืจื•ื ื’ ืงื•ืจืก (ืื™ืŸ ื”ืขืจืฅ)
ื“ื™ ื”ืขื›ืขืจ, ื“ื™ ื‘ืขืกืขืจ ื“ื™ ื’ืขื–ื•ื ื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ, ืึธื‘ืขืจ ื“ื™ ืžืขืจ ื–ื›ึผืจื•ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคืืจืœืื ื’ื˜ ืฆื• ืฉืึทืคึฟืŸ ืึทืŸ ืึทื•ื“ื™ืึธ ืฉืคึผื•ืจ ืคื•ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืœืขื ื’, ื“ื™ ืจืขืงืึทืžืขื ื“ื™ื“ ื•ื•ืขืจื˜ ืื™ื– 48000 (ื“ื™ ืžืขืจืกื˜ ืคึผืึทืกื™ืง ื’ืขื–ื•ื ื˜ ืงื•ื•ืึทืœื™ื˜ืขื˜)

byteRate
4
ื ื•ืžืขืจ ืคื•ืŸ ื‘ื™ื˜ืขืก ืคึผืขืจ ืกืขืงื•ื ื“ืข
sampleRate numChannels bitsPerSample (ื•ื•ื™ื™ึทื˜ืขืจ)

blockAlign
2
ื ื•ืžืขืจ ืคื•ืŸ ื‘ื™ื˜ืขืก ืคึฟืึทืจ 1 ืžื•ืกื˜ืขืจ
ื ื•ืžืขืจื˜ืฉืึทื ื ืขืœืก * ื‘ื™ืฅ ืคึผืขืจ ืกืึทืžืคึผืœืข: 8

bitsPerSample
2
ื ื•ืžืขืจ ืคื•ืŸ ื‘ื™ื˜ืŸ ืคึผืขืจ 1 ืžื•ืกื˜ืขืจ (ื˜ื™ืคืงื™ื™ึทื˜)
ืงื™ื™ืŸ ื ื•ืžืขืจ ื•ื•ืึธืก ืื™ื– ืึท ืงื™ื™ืคืœ ืคื•ืŸ 8. ื“ื™ ื”ืขื›ืขืจ ื“ื™ ื ื•ืžืขืจ, ื“ื™ ื‘ืขืกืขืจ ืื•ืŸ ื›ืขื•ื•ื™ืขืจ ื“ื™ ืึทื•ื“ื™ืึธ ื•ื•ืขื˜ ื–ื™ื™ืŸ; ืคึฟื•ืŸ 32 ื‘ื™ืฅ ืขืก ืื™ื– ืงื™ื™ืŸ ื—ื™ืœื•ืง ืคึฟืึทืจ ื™ื•ืžืึทื ื–

subchunk2Id
4
ื“ืึทื˜ืข ืจืขืคึฟืขืจืขื ืฅ ืฆื™ื™ื›ืŸ (ื•ื•ื™ื™ึทืœ ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืื ื“ืขืจืข ื›ืขื“ืขืจ ืขืœืขืžืขื ื˜ืŸ ื“ื™ืคึผืขื ื“ื™ื ื’ ืื•ื™ืฃ ื“ื™ ืึทื•ื“ื™ืึธืคืึธืจืžืึทื˜)
0x64617461 ืื™ืŸ ื‘ื™ื’-ืขื ื“ื™ืึทืŸ ("ื“ืึทื˜ืŸ")

ืกื•ื‘ื˜ืฉื•ื ืง2 ื’ืจื™ื™ืก
4
ื“ืึทื˜ืข ืฉื˜ื— ื’ืจื™ื™ืก
ื“ืึทื˜ืŸ ื’ืจื™ื™ืก ืื™ืŸ ื™ื ื˜

ื“ืึทื˜ืข
byteRate * ืึทื•ื“ื™ืึธ ื’ืขื“ื•ื™ืขืจ
ืึทื•ื“ื™ืึธ ื“ืึทื˜ืŸ
?

WAVE ื‘ื™ื™ืฉืคึผื™ืœ

ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ื˜ื™ืฉ ืงืขื ืขืŸ ืœื™ื™ื›ื˜ ื–ื™ื™ืŸ ืื™ื‘ืขืจื’ืขื–ืขืฆื˜ ืื™ืŸ ืึท ืกื˜ืจื•ืงื˜ื•ืจ ืื™ืŸ C, ืึธื‘ืขืจ ืื•ื ื“ื–ืขืจ ืฉืคึผืจืึทืš ืคึฟืึทืจ ื”ื™ื™ึทื ื˜ ืื™ื– ืคึผื™ื˜ื”ืึธืŸ. ื“ื™ ื™ื–ื™ืึทืกื˜ ื–ืึทืš ืื™ืจ ืงืขื ืขืŸ ื˜ืึธืŸ ืื™ื– ืฆื• ื ื•ืฆืŸ ืึท "ื›ื•ื•ืึทืœื™ืข" - ืึท ืจืึทืฉ ื’ืขื ืขืจืึทื˜ืึธืจ. ืคึฟืึทืจ ื“ืขื ืึทืจื‘ืขื˜ ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื“ืึทืจืคึฟืŸ ื”ื•ื™ืš ื‘ื™ื™ื˜ืจื™ื™ื˜ ืื•ืŸ ืงืึทืžืคึผืจืขืฉืึทืŸ.
ืขืจืฉื˜ืขืจ, ืœืึธื–ืŸ ืื•ื ื“ื– ืึทืจื™ื™ึทื ืคื™ืจ ื“ื™ ื ื™ื™ื˜ื™ืง ืžืึทื“ื–ืฉื•ืœื–:

# 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 ั…ะฒะฐั‚ะธั‚, ะฝะพ ะตัะปะธ ะฟะพัั‚ะฐะฒะธั‚ัŒ ะฑะพะปัŒัˆะต, ั‚ะพ ัˆัƒะผ ะฑัƒะดะตั‚ ัะปั‹ัˆะตะฝ ะปัƒั‡ัˆะต. ะก 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, ืขืก ืคืืจืงืขืจื˜ ืื•ื™ืก ืฆื• ื–ื™ื™ืŸ 80 ื ืคื•ืŸ ืจื™ื™ืŸ. ื•ื•ืึทื•ื• ื˜ืขืงืข, ืื•ืŸ ื‘ืœื•ื™ื– 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)  # ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฒ ั„ะฐะนะป ั€ะตะทัƒะปัŒั‚ะฐั‚

ื’ืึทื ืฅ

ืึทื–ื•ื™ ืื™ืจ ื”ืึธื˜ ื’ืขืœืขืจื ื˜ ืึท ื‘ื™ืกืœ ืžืขืจ ื•ื•ืขื’ืŸ ื“ื™ื’ื™ื˜ืึทืœ ื’ืขื–ื•ื ื˜ ืื•ืŸ ื•ื•ื™ ืขืก ืื™ื– ืกื˜ืึธืจื“. ืื™ืŸ ื“ืขื ืคึผืึธืกื˜ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื ื•ืฆืŸ ืงืึทืžืคึผืจืขืฉืึทืŸ (ืึทื•ื“ื™ืึธืคืึธืจืžืึทื˜), ืึธื‘ืขืจ ืฆื• ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื™ืขื“ืขืจ ืคื•ืŸ ื“ื™ ืคืึธืœืงืก ืึธื ืขืก, 10 ืึทืจื˜ื™ืงืœืขืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคืืจืœืื ื’ื˜. ืื™ืš ื”ืึธืคึฟืŸ ืื™ืจ ื’ืขืœืขืจื ื˜ ืขืคึผืขืก ื ื™ื™ึท ืคึฟืึทืจ ื–ื™ืš ืื•ืŸ ื“ืึธืก ื•ื•ืขื˜ ื”ืขืœืคืŸ ืื™ืจ ืื™ืŸ ืฆื•ืงื•ื ืคึฟื˜ ื“ื™ื•ื•ืขืœืึทืคึผืžืึทื ืฅ.
ื“ืื ืง ืื™ืจ!

ืงื•ื•ืืœืŸ

ื•ื•ืึทื•ื• ื˜ืขืงืข ืกื˜ืจื•ืงื˜ื•ืจ
WAV - ื•ื•ื™ืงื™ืคึผืขื“ื™ืข

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’