ch0nny_log

[빅데이터분석] 딥러닝_14. 음성 분류 신경망 인터페이스 만들기 본문

빅데이터 분석(with 아이티윌)/deep learning

[빅데이터분석] 딥러닝_14. 음성 분류 신경망 인터페이스 만들기

chonny 2024. 10. 22. 09:42

음성 분류 신경망 인터페이스 만들기

◾개와 고양이 음성 분류 신경망 인터페이스 함수 만들기

  • 파일 다운로드 받기 → 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()  #이 코드는 무조건 맨아래에 하나만 있으면 됨.