일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- %in%
- merge
- 순위출력
- count
- 그래프시각화
- 빅데이터분석
- 회귀분석
- 히스토그램 그리기
- 총과 카드만들기
- 정보획득량
- 데이터분석가
- 그래프 생성 문법
- Dense_Rank
- sql
- 불순도제거
- if문 작성법
- 빅데이터
- 회귀분석 알고리즘
- max
- 단순회귀 분석
- 막대그래프
- difftime
- 팀스파르타
- 데이터분석
- 상관관계
- loop 문
- 여러 데이터 검색
- sqld
- Sum
- Intersect
- Today
- Total
ch0nny_log
[빅데이터분석] 딥러닝_14. 음성 분류 신경망 인터페이스 만들기 본문
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
음성 분류 신경망 인터페이스 만들기
◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기
- 파일 다운로드 받기 → https://cafe.daum.net/oracleoracle/Sl3Y/600
- 파이썬 파일은 ‘c:\\사용자\\itwill’ / 모델 파일은 ‘c:\\sound2’ 에 저장하기
- 파이썬에서 음성인식 gui 최종.ipynb 열기
<aside> 📌
실습. 화면 구현하기
- upload_sound 함수 : 윈도우 탐색기가 열리면서 음성을 선택할 수 있는 함수
- sound_classify 함수 : 음성 ---> 모델 ---> 결과를 출력하는 함수
- upload_image 함수 생성하기
#1. 필요한 패키지를 전부 임폴트 합니다.
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
#2. upload_image 함수 생성
def upload_image():
try:
file_path=filedialog.askopenfilename() # 윈도우 탐색기를 열기
print(file_path)
# show_classify_button(file_path) # 음성 분류를 하는 함수에 음성 파일을 입력
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_image()
** 위 함수 실행하고 윈도우 창 닫으면 탐색기 창 떠있음. 거기서 아래와 같이 sound 폴더 들어가서 소리 하나 선택해주면 됨.
#upload_image 의 file_path 를 전역변수로 생성하기
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
- upload_sound 함수 생성
def upload_sound():
try:
global file_path
file_path=filedialog.askopenfilename() # 윈도우 탐색기 열기
except:
pass # try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
upload_sound()
print(file_path) # 전역 변수이므로 함수 밖에서 사용할 수 있습니다. 또는 다른 함수에서도 사용할 수 있습니다.
- sound_classify 함수를 만들기 위해서 다음의 함수 미리 생성하기
- sound_classify 함수의 역할: 음성 → 모델 → 결과를 출력하는 것
model = load_model('c:\\\\sound2\\\\model_keras.h5')
- 음성에 특징을 뽑아내는 함수 생성하기
- 특징: 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): # 음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) # (1,41) 은 아니고 그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list):# 리스트가 아니라면
audio_samples = [audio_samples] # 리스트화 해라
for sample in audio_samples: # 진폭 데이터 리스트를 하나씩 가져옵니다.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) # <https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) # 각 주파수별 평균값을 구합니다.
mfccsscaled = np.append(mfccsscaled, zero_cross_feat)
mfccsscaled = mfccsscaled.reshape(1, 41, ) # 41개의 값을 학습 데이터로 구성합니다. [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
- file_path 에 들어있는 음성 파일을 숫자로 변환하기
upload_sound() # 음성을 선택해서 파일위치와 이름을 file_path 에 담는 함수를 실행
print(file_path)
x_test = librosa.load(file_path)[0] # 해당 음성을 숫자로 변환해서 x_test 에 담기
print(x_test)
- file_path 에 들어있는 음성 파일의 sample rate (주파수 대역) 정보를 추출
upload_sound()
wave_rate = librosa.load(file_path)[1]
print(wave_rate)
- 위에서 얻은 두개의 값을 extract_features 함수에 넣어서 모델에 넣을 41개의 데이터를 출력하기
upload_sound()
x_test = librosa.load(file_path)[0]
wave_rate = librosa.load(file_path)[1]
x_test_features = extract_features( x_test, wave_rate )
print( x_test_features )
- 음성을 모델에 넣고 결과를 출력하는 classify 라는 함수를 생성하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
print(pred)
classify()
- 위에서 출력되는 확률 벡터를 cat 또는 dog 로 출력되게 하기
def classify():
upload_sound() # 음성을 선택해서
x_test = librosa.load(file_path)[0] # 숫자로 변환하고
wave_rate = librosa.load(file_path)[1] # 주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) # 41개의 학습 데이터를 만든후에
pred = model.predict( x_test_features.reshape( 1, 41, ) ) # 모델에 넣고 예측해라
a = np.argmax(pred) # 가장 큰 원소의 인덱스 번호를 추출합니다.
if a == 0:
print('cat')
else:
print('dog')
classify()
</aside>
◾개와 고양이 음성 신경망 인터페이스 최종 코드
#1. 필요한 패키지를 전부 임포트하기
import tkinter as tk
from tkinter import filedialog
from tkinter import *
from PIL import ImageTk, Image
import numpy as np
from keras.models import load_model
import cv2
import numpy
import glob
import librosa
from pygame import mixer #소리 재생 모듈
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
#2. upload_sound 함수 생성하기
def upload_sound():
try:
global file_path
global x_test_features
file_path=filedialog.askopenfilename() #윈도우 탐색기를 열기
x_test = librosa.load(file_path)[0] #숫자로 변환하고
wave_rate = librosa.load(file_path)[1] #주파수 대역을 추출해서
x_test_features = extract_features( x_test, wave_rate ) #41개의 학습 데이터를 만든 후에
except:
pass #try 와 except 사이에 문제가 생겨도 그냥 무시하라는 뜻
#3. 모델을 불러오기
model = load_model('c:\\\\sound2\\\\model_keras.h5')
#4. 음성에 특징을 뽑아내는 함수 생성하기
#특징은 소리의 주파수 스팩트럼 데이터 40개 + zero_crossing_rate 1개
def extract_features(audio_samples, sample_rate): #음성의 특징을 추출하는 함수
extracted_features = np.empty((0, 41, )) #그냥 41개의 값을 받을 비어있는 리스트를 할당하겠다는 뜻
if not isinstance(audio_samples, list): #리스트가 아니라면
audio_samples = [audio_samples] #리스트화 해라
for sample in audio_samples: #진폭 데이터 리스트를 하나씩 가져옴.
zero_cross_feat = librosa.feature.zero_crossing_rate(sample).mean() # 음성 신호 파형이 중심축(0) 을 통과하는 횟수
mfccs = librosa.feature.mfcc(y=sample, sr=sample_rate, n_mfcc=40) #<https://youdaeng-com.tistory.com/5>
mfccsscaled = np.mean(mfccs.T,axis=0) #각 주파수별 평균값을 구함. #<https://stackoverflow.com/questions/36182697/why-does-librosa-librosa-feature-mfcc-spit-out-a-2d-array>
mfccsscaled = np.append(mfccsscaled, zero_cross_feat) #주파수 40개에 대한 평균값 40개와 zero_cross_feat 값 를 가지고
mfccsscaled = mfccsscaled.reshape(1, 41, ) #41개의 값을 학습 데이터로 구성 [[293,291,293,...392]]
extracted_features = np.vstack((extracted_features, mfccsscaled)) #[[293,291,293,...392]]
return extracted_features
#5. 위에서 출력되는 확률 백터 [[0.11749879 0.8825012 ]] 를 cat 또는 dog 로 출력되도록 하기
# 음성---> 모델 ---> 결과(cat 또는 dog)
def classify():
pred = model.predict( x_test_features.reshape( 1, 41,)) #모델에 넣고 예측하기
a = np.argmax(pred) #가장 큰 원소의 인덱스 번호를 추출
if a == 0:
sign="This sound is a 'Cat' sound"
image_path = 'c:\\\\data\\\\cat.png'
else:
sign="This sound is a 'Dog' sound"
image_path = 'c:\\\\data\\\\dog.png'
uploaded = Image.open(image_path)
uploaded.thumbnail(((top.winfo_width()/2.25), (top.winfo_height()/2.25) ))
img = ImageTk.PhotoImage(uploaded)
sign_image.configure(image=img)
sign_image.image = img
sign_image.pack()
sign_image.place(relx=0.32, rely=0.2)
label.configure(foreground='#424242', text= sign)
label.place(x=85, y=50)
Draw_graph(pred) #분류 버튼을 누르면 그래프가 그려지도록 하기
#6. 확률 그래프 그리는 함수 생성하기
def Draw_graph(pred):
fig = plt.Figure(figsize=(7, 0.5 ), facecolor='#FFF8E1' ) #그래프의 크기와 색깔을 지정
plot = FigureCanvasTkAgg( fig, master=top) #tkinter 위에 그래프 올리기
# 확률 숫자 생성
y = [ 'Cat %0.3f'%pred[0][0], 'Dog %0.3f'%pred[0][1] ] #소수점이하 3번째까지만 2개의 확률 저장
# 그래프 그리기
fig.add_subplot(1,1,1).barh( y , pred[0], color='#C5E1A5') #그래프 그리기, 막대 색깔 설정
plot.draw() #그래프 그리기
plot.get_tk_widget().pack() #그래프 설정을 저장하기
plot.get_tk_widget().place(x=70, y=400 ) #그래프 위치 지정하기
#7. 소리를 재생하는 함수 생성하기
def Play():
if file_path: # file_path 에 음원의 위치와 이름이 들어있다면
mixer.init() # 초기화 작업 수행
mixer.music.load(file_path) # 음원을 불러들임
mixer.music.play() # 음원 재생
#8. 사용자 인터페이스 배경 판을 생성하기
top=tk.Tk() # tkinter(사용자 인터페이스 전문 모듈) 를 객체화
top.geometry('800x600') # 화면 크기를 결정
top.title('Cat and Dog Sound Classification') # 맨위에 제목
top.configure(background='#FFF8E1') # 판의 바탕 색깔, 구글에서 #CDCDCD 검색
#9. 분류하는 버튼을 판에 올리기
# 업로드 버튼 구현
upload=Button(top,text="Upload an sound",command=upload_sound,padx=10,pady=5)
upload.configure(background='#FFEBEE', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
upload.pack(side=BOTTOM, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
upload.place(relx=0.20, rely=0.8)
#분류 버튼 구현
classify_bt=Button(top,text="Classify an sound",command= classify ,padx=10,pady=5)
classify_bt.configure(background='#E3F2FD', foreground='#424242',font=('arial',10,'bold')) #버튼 색깔
classify_bt.pack(side=TOP, pady=50) # 버튼의 위치 , TOP, BOTTOM, LEFT, RIGHT 를 쓸 수 있음
classify_bt.place(relx=0.61, rely=0.8)
#소리 재생 버튼 구현
btn_play = Button( top, text = 'Play', width = 10, font = ('arial', 10, 'bold'), command = Play, background = '#FFF59D', foreground='#424242' )
btn_play.place(x=350, y=455) # 버튼의 위치를 지정
#10. 사진 붙이기
sign_image = Label(top)
sign_image.pack( side=BOTTOM, expand=True )
sign_image.place(relx =0.5, rely=0.3)
#11. 화면에 출력할 결과 구현하기
label = Label( top, background='#FFF8E1' , font =('arial', 35, 'bold') )
label.pack(side=BOTTOM,expand=True)
#12. 저작권 표시하기
copy = Label(top,font=('arial',8),
text="Copyright 2024. LHI Corp. All rights reserved. send email to gwm0120@gmail.com for use.",
background='#FFF8E1') # compound 는 text 자리 지정
copy.configure(background='#FFF8E1',foreground='#424242',font=('arial',8))
copy.pack(side=BOTTOM, anchor = 's', expand=False)
copy.place(relx=0.2, rely=0.96)
top.mainloop() #이 코드는 무조건 맨아래에 하나만 있으면 됨.
'빅데이터 분석(with 아이티윌) > deep learning' 카테고리의 다른 글
[빅데이터분석] 딥러닝_16. 사진 속에서 검출 인터페이스 만들기 (1) | 2024.10.24 |
---|---|
[빅데이터분석] 딥러닝_15. 딥러닝의 역사 (0) | 2024.10.22 |
[빅데이터분석] 딥러닝_13. 코렙에서 정상 이파리와 질병 이파리 분류 신경망 만들기 (0) | 2024.10.17 |
[빅데이터분석] 딥러닝_11. CNN 층 (1) | 2024.10.15 |
[빅데이터분석] 딥러닝_9. 2층 신경망 구현하기2 (오차 역전파로 2층 신경망 학습시키기) (2) | 2024.10.11 |