Study Concept
*) ๋ชฉ์ : Python๊ธฐ๋ฐ ์์ฑ ๋ฐ์ดํฐ์ ์์ฑ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ค ํ์ต
Dev Concept
*) Python pydub ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๊ณผ์
** ์์ = ํํ ์์ ๊ณ์ ์๊ฐํ๋ฉฐ ํ์ตํ๋ ๋น๊ต์ ์ฌ์
0. ๊ฐ๋ ์ ๋ฆฌ
#Reference: https://m.blog.naver.com/sam2934/22157444676
#Reference: yjh-phys.tistory.com/1386
๊ทธ๋ํ์์ ์ฃผ๋ณ๊ฐ๋ค์ ๋นํด ์๋์ ์ผ๋ก ๋์ด ์ฌ๋ผ์จ ๋ถ๋ถ: ๋ง๋ฃจ
๊ทธ๋ํ์์ ์ฃผ๋ณ๊ฐ๋ค์ ๋นํด ์๋์ ์ผ๋ก๋ฎ๊ฒ ๋ด๋ ค๊ฐ ๋ถ๋ถ: ๊ณจ
์๋ฆฌ๊ฐ 1ํ ์ง๋ํ๋๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ: ์ฃผ๊ธฐ (๋จ์ s)
๊ฐ์ ์์์ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ: ํ์ฅ (๋จ์ m)
๊ณจ or ๋ง๋ฃจ์ ๋ํ ๋ณ์์ ์ ๋๊ฐ: ์งํญ (=amplitude)
#Reference: https://ndb796.tistory.com/15
์๋ฆฌ : ๋ฌผ์ฒด์ ์ง๋.
=> ๋ฌผ์ฒด์ ์ง๋ -> ์ง๋์ผ๋ก๋ถํฐ์ ์๋ ฅ ์ ๋ฌ -> ์๋ฆฌ ์์ฑ
ํํ: ์๋ฆฌ์ ์กด์ฌํ์ธ ๊ณต๋ช ์ ํํ
ํํ์ ํน์ง ๋ถ๋ฅ ๊ธฐ์ค: ์ฃผ๊ธฐ(T), ์งํญ, ์ฃผํ์(F)
์ฃผ๊ธฐ & ์ฃผํ์: ๋ฐ๋น๋ก
์ฃผํ์์ ๋ถ๋ฅ:
์ด์ ์ฃผํ (0-20Hz)
๊ฐ์ฒญ์์ญ (20Hz-20KHz)
์ด์ํ (20KHz - 1GHz)
๊ทน์ด์ํ (1GHz - 10THz)
ํธ๋ฆฌ์ ๋ณํ:
"์ด๋ค ์ฃผ๊ธฐ์ ํํ๋ ๋ง์ ์์ ์ ํํ์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ค"๋ ์ํ์ ์ ๋ฆฌ
* ์ ํํ: ์ผ๊ฐํจ์ ์ค sin or cos ํจ์๋ก ๋ ์ฃผ๊ธฐ์ ํธ์ ์ด์นญ
ํธ๋ฆฌ์ ๊ธ์: ์์์ ์ฃผ๊ธฐํจ์๋ฅผ ์ง๊ต๊ด๊ณ์ ์๋ ์ผ๊ฐํจ์์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๊ฒ
* ์ง๊ต๊ด๊ณ: ๋๊ฐ์ ๋์์ ๋ํ์ฌ, ๋์๋๋ ๋ฒกํฐ์ ๋ด์ ์ด 0 (=๋์ด ์ง๊ฐ)์ ์ด๋ฃฐ ๋์ ๊ด๊ณ
ํธ๋ฆฌ์ ๋ณํ: ์์์ ๋น์ฃผ๊ธฐํจ์๋ฅผ ์๊ฐ์์ญ์์ ์ฃผํ์์ ์์ญ์ผ๋ก ๋ํ๋ด๋ ๊ฒ
#Reference: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=qui25&logNo=100099281343
๋ชจ๋ ธ vs ์คํธ๋ ์ค vs ์๋ผ์ด๋:
๋ชจ๋ ธ: ์ฌ๋ฌ ์คํผ์ปค๊ฐ ์กด์ฌํ์ฌ๋ ๋ชจ๋ ์คํผ์ปค์์ ๊ฐ์ ์๋ฆฌ๊ฐ ์ก์ถ๋๋ ์์คํ (1์ฑ๋)
์คํธ๋ ์ค: ์ข/์ฐ๋ฅผ ๋๋์ด ์๋ฆฌ๋ฅผ ์ก์ถํ๋ ์์คํ . (2์ฑ๋)
์๋ผ์ด๋: 3๊ฐ์ง ์ด์์ ์๋ฆฌ๋ฅผ ๋๋์ด ์ก์ถํ๋ ์์คํ . ํ์์ดํฐ์ฉ 5.1Ch๊ฐ ์์ (์ข/์ฐ/์ /ํ ๊ตฌ๋ถ ๊ฐ๋ฅ)(4์ฑ๋).
์คํผ์ปค ์ฑ๋ / ์จ์ด :
์ฑ๋: ์ ์ฒด์ ์ธ ์ฌ์์ ์ํด ์๋ฆฌ๋ฅผ ๋ค๋ฅด๊ฒ ์ฌ์ํ๋ ํต๋ก
์จ์ด: ์๋ฆฌ์ ๋์ด๋ฅผ ๋๋์ด ๋ด๋ ์์คํ (๊ณ ์/์ค์/์ ์)
3-Way ์คํผ์ปค: 3๊ฐ์ ์จ์ด๋ก ๋๋์ด์ ธ ์๋ฆฌ๋ฅผ ์ก์ถํ๋ ์คํผ์ปค. ํธ์ํฐ (๊ณ ์) / ์ค์ฝ์ปค (์ค์) / ์ฐํผ (์ ์)
=> ์คํผ์ปค์ ํฌ๊ธฐ๊ฐ ์ปค์ง -> ์ง๋ ์ธ๊ธฐ ์ฆ๊ฐ -> ํํ ์์ญ๋๊ฐ ๋ฎ์์ง
#Reference: https://ndb796.tistory.com/16
ํ๋ณธํ
: ์๋ ๋ก๊ทธ ํํ์ ๋์งํธ ํํ๋ก์ ์ ํ์ ์ํด ํ๋ณธ์ ์ทจํ๋ ๊ฒ.
+) ํ๋ณธํ์์ ์์์ ์์ค์๋ ๋ฐ์์ ์ํด์๋ ๊ธฐ์กด ์๋ ๋ก๊ทธ ์ ํธ์ ํฌํจ๋ ๊ฐ์ฅ ๋์ ์ง๋์์ 2๋ฐฐ์ ํด๋นํ๋ ๋น๋์ ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ์ํ๋ง์ ํด์ผ ํจ (๋์ดํด์คํธ ์ ๋ฆฌ)
์์ํ
: ํ๋ณธํ๋ ๊ฐ ์ ์ ์ด๋ ์ ๋์ ์ ๋ฐ๋๋ก ํํํ ๊ฒ์ธ๊ฐ.
+) 8bit: 2^8 -> 256๋จ๊ณ์ ์์ํ ๊ฐ๋ฅ
++) 16bit: 2^16 -> 65536๋จ๊ณ์ ์์ํ ๊ฐ๋ฅ ( = ์ ๋ฐ๋ ํฅ์ )
๋ถํธํ
: ํ๋ณธํ/์์ํ๊ฐ ์๋ฃ๋ ๋์งํธ ์ ๋ณด๋ฅผ 2์ง์๋ก ํํํ๋ ๊ฒ. ์์ถ๋ ๊ฒฝ์ฐ ์ด ๋จ๊ณ์์ ์์ถ๋จ.
Ex) ์ ์ฅ๋๋ ํ์ผ์ ํฌ๊ธฐ
1. ํ๋ณธํ์จ: 11.025KHz | ์์ํ ์ ๋ฐ๋: 8bit | ์์๊ธธ์ด 1๋ถ (=60s) | ๋ชจ๋ ธ (mono)
= 11.025 x 8 x 60 = 52,920.00 bit ( ≈ 650 KB )
2. ํ๋ณธํ์จ: 22.05KHz | ์์ํ ์ ๋ฐ๋: 16bit | ์์๊ธธ์ด 1๋ถ (=60s) | ์คํธ๋ ์ค (stereo)
= 22.05 x 16 x 60 x 2 = 423,360.00 bit ( ≈ 5.25 MB )
1. ํ์ผ ๋ณํ (mp3 -> wav)
* ํธ๋ค๋งํ ํ์ผ ํ์ฅ์: mp3 (=์์ค ์์ถํ ์์ํ์ผ) => wav๋ก ๋ณํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์์ ๊ฒ์
#Reference: https://pythonbasics.org/convert-mp3-to-wav/#MP3-to-WAV-conversion
from pydub import AudioSegment
src = "test.mp3" # origin file
dst = "test.wav" # convert file name
sound = AudioSegment.from_mp3(src) # load file as extention 'mp3'
sound.export(dst, format="wav") # convert file to wav
=> test.wav ํ์ผ์ด ์์ฑ๋จ
2. ์์ ์๋ฅด๊ธฐ
1. wav ํ์ผ ๋ก๋ & ์์์ ๊ธธ์ด ๊ฐ์ ธ์ค๊ธฐ
w = wave.open(os.path.join(os.getcwd(), "noises", "sample", "origin.wav"), "r")
=> '[project_dir]/noises/sample/origin.wav' ๊ฒฝ๋ก์ ํ์ผ์ "์ฝ๊ธฐ์ ์ฉ"์ผ๋ก ์ฐ๋ค.
wavLen = w.getnframes() / w.getframerate()
=> ์์ ๊ธธ์ด = ์์ ํ์ผ์ ํ๋ ์ ์ / ์์ ํ์ผ์ ํ๋ ์๋ ์ดํธ (=์ด๋น ํ๋ ์ ์)
2. ์งํญ ๊ตฌํ๊ธฐ
buffer = w.readframes(w.getnframes())
=> ์ฝ์ด์จ ํ์ผ์ ํ์ผ์ ํ๋ ์ ์๋งํผ์ ํ๋ ์์ ์ฝ์ด ๋ฒํผ๋ก ๋ก๋ํ๋ค.
amplitude = (np.frombuffer(buffer, dtype="int16"))
=> ๋ก๋ํ ๋ฒํผ๋ฅผ int16ํ์์ ๋ฐ์ดํฐํ์ ์ ๋ด์ ๋ฆฌ์คํธ๋ฅผ amplitude ๋ณ์์ ๋ด๋๋ค.
=> ์งํญ๋ฐฐ์ด์ ๊ธธ์ด = ํ๋ ์ ์ * ์ฑ๋ ์
3. ์๋ฅด๊ธฐ
s_amp = amplitude[int(startsec * w.getframerate() * w.getnchannels()):int(endsec * w.getframerate() * w.getnchannels())]
=> "์์ ์ด (=startsec) * ํ๋ ์ ์ * ์ฑ๋ ์ ~ ๋ ์ด (=endsec) * ํ๋ ์ ์ * ์ฑ๋ ์"๊น์ง๋ง s_amp์ ๋ด๊ธฐ.
4. ์ ์ฅ
# save wave
save_wave = wave.Wave_write(os.path.join(spath, orgfilename + "_cut.wav"))
save_wave.setparams(w.getparams())
save_wave.writeframes(array.array('h', s_amp).tobytes())
save_wave.close()
wave.Wave_write()๋ฅผ ํตํด ์ ์ฅํ ์์น๋ฅผ ์ง์ .
setparams()๋ฅผ ํตํด params๋ฅผ ์ค์ ํ๋ฉฐ, writeframes๋ฅผ ํตํด ํ๋ ์๋ณ๋ก ๋ค์ด๊ฐ ํํ๊ฐ์ ๋ฐฐ์ด์์ ๊ฐ์ ธ์ด
array.array๋ s_amp ๋ฆฌ์คํธ ์์ ๊ฐ์ ์ ์๋๋ ํ์ ๊ฐ์ผ๋ก ๋ฐฐ์ด์ ์์ฑํจ.
save_wave.close()๋ฅผ ํตํด ์คํธ๋ฆผ ๋ซ์.
'๐ก Lang > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Study Log] Python ์์ํ์ผ ํ๋ ์๋ณ ์ด๋ฏธ์ง ์ถ์ถ (0) | 2021.04.29 |
---|