파이썬 실습/GUI, 음성파일 텍스트 추출기

파이썬 GUI 음성파일 텍스트 추출기 - 3. 음성->텍스트로 변환

파기차차 2023. 3. 19. 20:36
728x90
반응형
SMALL

ㅁ 개요

 

O 프로그램 소개

 

 

- 이번 글은 이전글(파이썬 GUI 음성파일 텍스트 추출기 - 2. 파일 변환)에 이은 3번째 글로 wav파일로 변환 후 구글의 speech_recognition 모듈을 이용하여 음성을 텍스트로 변환하는 방법에 대하여 살펴보겠습니다.

 

O 완성된 프로그램 실행 화면

 

 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

1.프로그램을 실행하면 아래와 같이 실행됩니다.

 

 

 

 

 2.음성파일(wav, mp3, m4a 중 택1)을 선택 후 열기 버튼을 클릭합니다.

 

 

 

 3. 아래와 같이 '변환' 버튼을 클릭하면 음성파일이 텍스트로 변환되고, '실행 결과' 아래에 출력됩니다.

(여기서 음성파일 bbb.mp3파일의 내용은 '안녕하세요' 만 포함되어 있습니다.)

 

 

 

 

 4.실제 실행 폴더에 가서 확인 결과 아래와 같이 'bbb.mp3 -> bbb.wav' 파일로 잘 변환되었고, 'memo.txt' 파일이 새로 생성되었습니다.

 

 

 

 

 

 5. 'memo.txt' 파일을 열어보면 음성내용이 텍스트로 잘 저장된 것을 확인할 수 있습니다.

 

 

 

 

 

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 : voicefileToText.py

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtWidgets
import os
from PyQt5.QtGui import *
import speech_recognition as sr # 음성인식 모듈
import pydub
import webbrowser as wb
# from pydub import AudioSegment
import time

form_class = uic.loadUiType("voiceTotext.ui")[0]

class MyWindow(QMainWindow, form_class):
    def __init__(self):
        super().__init__()

        self.setFixedSize(800,600)
        self.setWindowIcon(QIcon("pagichacha.png"))
        self.setupUi(self)

        self.pushButton.clicked.connect(self.voiceToText)
        self.toolButton.clicked.connect(self.selectFile)


    def m4aToWav(self, fromVoiceFile): # 휴대폰 통화 녹음파일
        # m4a_file = 'sunny.m4a'
        # wav_filename = 'sunny.wav'
        voiceFile = fromVoiceFile
        name, ext = os.path.splitext(voiceFile)
        dir = os.path.dirname(file[0])
        os.chdir(dir)
        m4asound = pydub.AudioSegment.from_file(fromVoiceFile,  format= 'm4a')
        m4asound.export(name+".wav", format='wav')

    def mp3ToWav(self, fromVoiceFile): # 일반 음악 파일
        voiceFile = fromVoiceFile
        name, ext = os.path.splitext(voiceFile)
        dir = os.path.dirname(file[0])
        os.chdir(dir)
        mp3sound = pydub.AudioSegment.from_mp3(fromVoiceFile)
        mp3sound.export(name+".wav", format="wav") # mp3 -> wav파일로 변환


    def voiceToText(self):
        if self.lineEdit.text():
            voiceFile = os.path.basename(file[0])
            print(voiceFile, "++++++++++++++++++ 1")
            name, ext = os.path.splitext(voiceFile)
            print(name, "++++++++", ext)
            dir = os.path.dirname(file[0])
            os.chdir(dir)

            if not (ext == '.m4a' or ext == '.mp3' or ext == '.wav'):
                print("m4a, mp3, wav 파일이 아닙니다.")
                print("m4a, mp3, wav 파일 외에는 음성파일을 사용할 수 없습니다.")
                self.textEdit.setText("m4a, mp3, wav 파일 외에는 음성파일을 사용할 수 없습니다.")
            else:
                

                if ext == '.m4a':
                    print("m4a 형식의 파일을 wav 파일로 변환합니다.")
                    self.textEdit.setText("m4a 형식의 파일을 wav 파일로 변환합니다.")
                    self.m4aToWav(voiceFile)
                elif ext == '.mp3':
                    print("mp3 형식의 파일을 wav 파일로 변환합니다.")
                    self.textEdit.setText("mp3 형식의 파일을 wav 파일로 변환합니다.")
                    self.mp3ToWav(voiceFile)
                elif ext == '.wav':
                    print("wav 형식의 파일을 선택하셨습니다.")
                    self.textEdit.setText("wav 형식의 파일을 선택하셨습니다.")
                else:
                    print("m4a, mp3, wav 파일 외에는 음성파일을 사용할 수 없습니다.")
                    self.textEdit.setText("m4a, mp3, wav 파일 외에는 음성파일을 사용할 수 없습니다.")

                time.sleep(3)


                # 음성인식 부분
                r = sr.Recognizer()
                harvard = sr.AudioFile(name+'.wav')
                with harvard as source: #<---------------- 여기 에러부터 다시 시작
                    audio = r.record(source) # .wav파일을 오디오 데이터 인스터스로 만듦



                text = r.recognize_google(audio, language='ko-KR') # 만들어진 오디오 데이터 인스턴스를 다시 구글 음성인식 모듈로 텍스트로 변환함

                print(text) # 구글 번연(AI)으로 음성(.wav)파일의 음성을 텍스트로 변환
                self.textEdit.setText(text)

                with open('memo.txt', 'w') as f: # memo.txt 파일로 번역된 텍스트 저장
                    f.write(str(text)+"\n")

        else:
            print("음성파일을 선택하지 않았거나, 파일명을 입력하지 않았습니다.")
            self.textEdit.setText("음성파일을 선택하지 않았거나, 파일명을 입력하지 않았습니다.")


    def selectFile(self):
        pass
        global file
        file = QtWidgets.QFileDialog.getOpenFileName()
        print(file)
        print(file[0])
        self.lineEdit.setText('{}'.format(file[0]))

app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")

 

 

 

UI파일 : voiceTotext.ui

voiceTotext.ui
0.00MB

 

 

 

 

 
 - 소스파일을 cmd, 파워쉘 또는 vscode 등에서 아래와 같이 실행하시기 바랍니다.
 
 > python voicefileToText.py

 

 


 
 

 

O 주요 내용

관련된 소스를 살펴보겠습니다.

 

1.GUI 창을 띄우기 위해 관련 모듈을 임포트하고  미리 만들어둔 UI를 로드하기 위하여 form_class변수에 할당 후 초기화 함수를 만들어 줍니다.

 

 

※ GUI 창 띄우기 관련 자세한 설명은 아래 링크를 참고 부탁드립니다.

https://pagichacha.tistory.com/10

 

참고로 qt designer에서의 오브젝트의 이름은 다음과 같이 크게 4가지로 구성되어 있습니다.

 

 

 

2. 이전 글에서 설명한 변환프로그램을 가져다 쓰기 좋도록 아래 코드와 같이 함수형태로 만들어 둡니다.

 

 

 

 

 

3. 실제 wav파일로 변환하는 부분의 소스코드 입니다.

먼저 파일을 선택했는지 확인 후 선택했으면 if문을 실행합니다. (line 47)

확장자가 mp3, m4a, wav 파일 정도만 텍스트 추출을 가능하게 할 예정이므로 파일이름 부분과 확장자를 나누어야 하며 그렇게 하기 위해 아래와 같이 코딩합니다.

voiceFile = os.path.basename(file[0]) <-- 'bbb.mp3' 와 같이 파일 이름+확장자만 뽑아줌

 

여기서 다시 파일이름과 확장자를 분리하기 위해 splitext()함수를 사용합니다.(line 50)

 

그리고 우리가 프로그램을 실행한 위치에 wav파일을 생성해야 하므로 해당 위치로 이동하기 위해 아래와 같이 해줍니다.

dir = os.path.dirname(file[0]) <-- 'D:/100-1 Study/710_Wikidocs/210_wikiDocsAutoBitcoin/620_유튜버&블로그/20230213_파이썬 GUI 음성파일 텍스트추출기/1.음성파일 텍스트추출'

os.chdir(dir) <-- 위의 경로로 이동 (line 53)

 

 

 

 

 

4.아래 코드는 위에서 변환된 wav파일을 읽어서 텍스트로 변환하는 부분입니다.

어려운 내용이 없으므로 아래 코드의 주석을 참고하여 주시기 바랍니다.

 

 

 

5.변환할 음성파일을 선택하는 부분입니다.

 

여기서 한가지 주의할 점은 file변수를 global로 선언해 주어야 클래스 내의 다른 함수에서 사용할 수 있습니다.

 

 

 

 

 

 

 

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 wav파일로 변환 후 구글의 speech_recognition 모듈을 이용하여 음성을 텍스트로 변환하는 방법에 대하여 살펴보았습니다.
 
 - 오늘 우리가 배운 내용을 정리해 보면 아래와 같습니다.
 
 
 > 1.음성파일을 텍스트로 변환시 아래와 같이 코딩
r = sr.Recognizer()
harvard = sr.AudioFile(name+'.wav')
with harvard as source: 
     audio = r.record(source)
text = r.recognize_google(audio, language='ko-KR') 

 

 

이것으로 '파이썬 GUI 음성파일 텍스트 추출기' 포스팅을 마칩니다.

 

 

여기까지 읽어주셔서 감사하고, 댓글하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.

 

 

감사합니다.

 

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

 

728x90
반응형
LIST