상세 컨텐츠

본문 제목

수학과 함께하는 AI기초_03(소리데이터합성)

파이썬·장고·루비·알고리즘

by 김일국 2024. 12. 17. 12:40

본문

지난 시간 [수학과 함께하는 AI기초_02(소리데이터처리)] https://kimilguk.tistory.com/895 에 이어서

온라인강좌) EBS 이솦: https://www.ebssw.kr/lrnng/alctcr/alctcrDetailView.do?alctcrSn=56134

- 강좌명 : 수학과 함께하는 AI기초 #1 - 데이터의 표현과 가공

- 14개 챕터(장), 31개 강의로 이루어 져 있고, 지금 13-1장(챕터) ~ 이후를 하고 있습니다.

오늘은 소리데이터를 디지털 데이터로 생성하는 순서인 *표본화,*양자화,*부호화 에 대해서 알아보고,

이후 2개의 소리 합성하기하는 과정을 알아 보도록 하겠습니다.

- 아래 코드에서 *표본화,*양자화,*부호화 부분이 코딩에서는 어느 부분인지 확인 해 볼 수 있습니다.(아래)

# 소리데이터를 디지털 데이터로 생성:*표본화,*양자화,*부호화 후 2개의 소리 합성하기
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio
from scipy.io.wavfile import write
import os

# 1초 데이터 생성을 위한 변경변수 생성(아래)
Fs = 44100.0 # 주기 약 16비트(65,536)인 CD음반 정도의 음
tlen = 1 # 재생시간
Ts = 1/Fs # 주기의 내부 샘플링 간격(시간)
t = np.arange(0, tlen, Ts) # [0,1]사이의 수를 44,100 으로 나눈 배열생성(시간)

# 1초차리 시그널 생성(아래)
sin_freq = 440 # 음워 데이터의 주파수 개수
src = 2*np.pi*sin_freq*t # X값 *표본화=440개의 라디안 단위를 44,100개의 라디안 배열로 변환
print(np.shape(src))
signal = np.sin(src) # y값 *양자화=위 44,100개의 라디안 값을 sin라디안으로 변환
print(np.shape(signal))

# 위 signal 데이터를 그래프로 표현
x_range = 200 # x축 0부터 200개 까지의 데이터범위만 출력
plt.plot(t[0:x_range], signal[0:x_range], color = 'blue')
# plt.show() # signal 소리 그래프 출력
# 위 데이터를 wav로 저장하기(아래)
# 신호/신호의절대값의최고값으로 나눈다.=정규화(0부터 1사이틔 값으로 변환)+계산하기 편리
scaled = np.int16(signal/np.max(np.abs(signal)) * 32767)
write('sin_signal.wav', 44100, scaled) # 실행코딩 *부호화=주기는 코드 상단의 Fs와 동일하게
os.system("start sin_signal.wav") # 윈도우에서 소리듣기
# 합성할 1초까리 노이즈 신호 만들기(아래)
noise = np.random.uniform(-1, 1, len(t)) # -1~1사이에 44,100개로 구성된 잡음 데이터 생성
scaled_noise = 0.3*noise # 소리 볼륨을 30% 줄인다.(numpy 배열 형태로 생성됨)
scaled = np.int16(scaled_noise/np.max(np.abs(scaled_noise)) * 32767)
write('sin_noise.wav', 44100, scaled) # 실행코딩 *부호화=주기는 코드 상단의 Fs와 동일하게
os.system("start sin_noise.wav") # 윈도우에서 소리듣기
# 위 sgnal 소리와 noise 소리를 합성하기(아래)
signal_n = signal + noise
print(np.max(np.absolute(signal_n)))
signal_n = signal + scaled_noise
print(np.max(np.absolute(signal_n)))

# 위 데이터를 wav로 저장하기(아래)
# 신호/신호의절대값의최고값으로 나눈다.=정규화(0부터 1사이틔 값으로 변환)+계산하기 편리
scaled = np.int16(signal_n/np.max(np.abs(signal_n)) * 32767)
write('sin_signal_n.wav', 44100, scaled) # 주기는 코드 상단의 Fs와 동일하게
os.system("start sin_signal_n.wav") # 윈도우에서 소리듣기
# 위 scaled_noise 데이터를 그래프로 표현
plt.plot(t[0:x_range], scaled_noise[0:x_range], color = 'red')
plt.show() # scaled_noise 소리 그래프 출력
# 위 signal_n 데이터를 그래프로 표현
plt.plot(t[0:x_range], signal_n[0:x_range], color = 'green')
plt.show() # scaled_n 함봇소리 그래프 : 잡음이 들어간 사인 그래프가 만들어 진다.

위 소스에서 첫번째 plt.show()함수로 표본화, 양자화를 거친 비프음과 잡음 2가지 사인(sin)파형을 볼수 있습니다.(아래)

- 위 2개의 소리를 합성한 sin(사인)그래프는 아래와 같습니다.(아래)

- write('sin_signal.wav', 44100, scaled) 이 실행코딩으로 파일로 저장 시 *부호화 가 진행되고, 윈도우에서 실행할 수 있다(아래)

- 위 소스에서 생성된 합성 파일입니다.(아래)

sin_signal_n.wav
0.08MB

 

 

관련글 더보기

댓글 영역