ืืขืื! ืืืึทื ืขืจืฉืืขืจ ืกืขืจืืข ืคืื โโโโืึทืจืืืงืืขื ืืืขื ืคืึธืงืืก ืืืืฃ ืืขืจื ืขื ืืืื / ืึทืืืืึธ ืงืึทืืคึผืจืขืฉืึทื ืืื ืกืืึธืจืืืืฉ ืืขืืืึธืืก ืึทืืึท ืืื ืืืฉืคึผืขื (ืืืื) ืืื ืืืึทืืืข (ืืขืืื ื), ืืื ืืืขื ืืืื ืึทืจืืึทื ื ืขืืขื ืืืืฉืคืืื ืคืื ืืืืื ื ืืฆื ืื ืคึฟืึธืจืืึทืืืจืื ืืขื (.ืืืฉืคึผื, .ืืืึทืื) ืืื ืคืืจ. ืืื ืืขื ืืืื ืืืจ ืืืขืื ืงืืงื ืืื 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):
ืื ืืื ืฆืข ืงืึธื (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 ืึทืจืืืงืืขื ืืืขื ืืืื ืคืืจืืื ืื. ืืื ืืึธืคึฟื ืืืจ ืืขืืขืจื ื ืขืคึผืขืก ื ืืึท ืคึฟืึทืจ ืืื ืืื ืืึธืก ืืืขื ืืขืืคื ืืืจ ืืื ืฆืืงืื ืคึฟื ืืืืืขืืึทืคึผืืึทื ืฅ.
ืืื ืง ืืืจ!
ืงืืืืื
ืืงืืจ: www.habr.com