인공지능

5분만에 인공지능 음성 인식기 만들기 (파이썬, Google Colab)

도시쥐 2022. 2. 12. 02:47

안녕하세요!

 

스마트폰이 보급화된 요즘시대에 여러분 대부분은 구글의 구글 어시스턴트, Apple의 Siri등을 모두 써보셨을겁니다.

그리고 아마존의 Alexa도 있습니다. 이 세가지가 가장 유명한 음성인식 애플리케이션들인데요.

Google 어시스턴트
Apple의 음성 비서 Siri

 

아마존의 Alexa

 

이런 음성인식 기술들이 어떻게 구현되는지 궁금하지 않으신가요?

 

오늘은 파이썬 라이브러리를 이용해 간단히 5분만에 구현하는 음성인식기를 구현해보겠습니다. 

 

구현은 가장 간단한 방법을 통해 해보겠습니다.

 

 

준비물: Google계정, 인식시키고 싶은 음성

 

 

자 우선 첫번째로는 어떤 음성을 인식시켜 텍스트화 시킬지 정해야겠죠?

 

테스트 음성으로 준비한 데이터는 영화 '노트북(2004)'의 명대사 부분 음성파일입니다.

 

notebook.wav
4.48MB

 

직접 영어 음성을 녹음하셔서 변환하고 싶다면 녹음파일을 만들어 .wav 확장자로 준비해주세요!

 

다음으로는 구글 계정입니다. 구글에 로그인 하신뒤에 Google Colab으로 들어가주세요.

 

https://colab.research.google.com/

 

Google Colaboratory

 

colab.research.google.com

 

 

다음으로, Google Colab에 들어가서 새 노트를 만들고, 음성파일(녹음파일)을

구글드라이브에 업로드해 연동시키겠습니다. 다운받은 음성파일(또는 녹음파일)을 구글 드라이브에 업로드해주세요.

(가장 처음 뜨는 경로에 하는게 편합니다.)

구글 드라이브에 음성파일 업로드

 

https://opac.tistory.com/3

 

구글 드라이브와 코랩(Colab) 연동하기

구글 코랩(Colab)이란? 구글에서 자체적으로 제공하는 Jupyter Notebook으로, 인프라를 구글 클라우드에 기반하고 있기 때문에, 일반 사용자의 PC보다 깔끔하고 직관적으로 실행할 수 있는 것이 특징이

opac.tistory.com

 

위 링크의 방법대로 Colab에서 구글 드라이브를 마운트 하셨다면 

 

 

왼편의 파일 - drive - MyDrive/gdrive

 

drive/MyDrive 또는 drive/gdrive

위 주소에서 음성 파일을 찾을 수 있습니다.

 

 

 

전체 코드는 아래 링크에 업로드 해두겠습니다.

https://colab.research.google.com/drive/1qCyP9EXp8dFhEl6lkrhbha3ItijnTTEe?usp=sharing

 

5minute_project.ipynb

Colaboratory notebook

colab.research.google.com

 

 

Colab의 drive/MyDrive 또는 gdrive 의 음성파일

여기까지 했다면 준비는 끝났습니다. 다시 Colab의 빈노트 부분을 보겠습니다.

 

 

 

1. 우선 가장 먼저 활용할 python 라이브러리인 transformers를 설치해주겠습니다.

pip install transformers

 

 

 

 

pip install transformers 실행결과

 

 

잘 실행됐다면 위와 같이 나옵니다.

 

 

 

 

2. 음성처리에 사용할 추가적인 라이브러리를 import 해줍니다.

import torch
import librosa
import numpy as np
import soundfile as sf
from scipy.io import wavfile
from IPython.display import Audio
from transformers import Wav2Vec2ForCTC, Wav2Vec2Tokenizer

import한 library에 대해 설명드리자면,

1) torch : pyTorch 라는 딥러닝 프레임워크 입니다. 페이스북 AI팀에 의해 개발되었습니다. 데이터 작업과 모델 생성, 매개변수 최적화, 모델 저장등을 간편하게 할 수 있습니다.

 

2) librosa :  Python에서 음성데이터를 분석해주는 라이브러리입니다. 음성 신호처리에 사용되는 대부분의 기능들이 구현되어 있습니다.

 

3) numpy :  고성능 수치계산을 위해 제작된 라이브러리입니다. Numerical Python의 줄임말으로, 벡터나 행렬 연산에서 매우 편리한 기능을 제공합니다.

 

4) soundfile : 음성데이터를 가져올 때 사용되는 라이브러리 입니다.

 

5) wavfile : wav확장자를 가져오기 위해 사용하는 라이브러리입니다.

 

6) Audio : 음성데이터 재생을 위해 사용하는 라이브러리입니다.

 

7) Wav2Vec : 위 1. 에서 설치한 트랜스포머(transformer)의 라이브러리로, Wav2Vec은 음성데이터를 벡터값으로 변환해 주는것을 말합니다. 이 방식은 페이스북(Facebook) AI팀에서 제안한 방식으로, 음성인식(speech recognition)에서 매우 좋은 성능을 보여줍니다.

 

 

 

Wav2Vec에 대해서는 추후 포스트에서 더욱 자세히 다루겠습니다.

 

제대로 import 되었다면 왼쪽에 체크표시가 생깁니다.

import 라이브러리

 

 

 

3. 음성데이터 확인하기

file_name = '/content/drive/MyDrive/notebook.wav' //또는 음성데이터의 경로
Audio(file_name)

자 이제 라이브러리를 모두 가져왔으니 음성데이터가 잘 연동되는지 확인해보겠습니다.

 

직접 음성데이터를 가져왔다면 file_name 의 경로에 맞게 수정해주시면 됩니다.

 

audio(file_name) 함수를 통해 음성데이터를 들어볼 수 있습니다.

 

 

 

 

 

4. 모델 및 토크나이저 생성

tokenizer = Wav2Vec2Tokenizer.from_pretrained("facebook/wav2vec2-base-960h")
model = Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h")

본 포스팅에서는 직접학습이 아닌 이전에 학습된 모델을 가지고 음성인식을 수행합니다. 다른 누구가에 의해 학습되어있는 모델을 pre-trained model이라고 하는데, 여기서 가져온 모델은 페이스북(Facebook)에서 학습시킨 모델입니다.

 

 

1) tokenizer(토큰화)는, 데이터가 필요에 맞게 전처리(Pre-processing)되지 않은 상태라면 해당 데이터를 사용하고자 하는 용도에 맞게 토큰화 시켜주는 작업을 필요로 합니다. 이를 수행해주는 함수입니다.

 

 

2) model은, 위에 말씀드렸듯이 이미 학습된 모델을 가져오는 단계입니다. 우리가 가져온 음성데이터를 이 모델에 통과시키게 됩니다.

 

 

model을 웹에서 다운로드하기 때문에 실행하는데 약간의 시간이 소요됩니다.

모델과 tokenizer 가져오기

 

 

 

 

5. 음성데이터를 함수 변수에 넣기

data = wavfile.read(file_name)
framerate = data[0]
sounddata = data[1]
time = np.arange(0,len(sounddata))/framerate
print(data)
print('Sampling rate:',framerate,'Hz')

1) 위에서 가져온 음성 데이터파일을 'data'변수에 read해줍니다.

 

2) data[0]의 자료인 frame rate를 sounddata 변수에 넣어줍니다.

 

3) data[1]의 자료인 실제 sound data를 sounddata 변수에 넣어줍니다.

 

 

잘 실행되었다면 아래와 같이 출력값이 나오게 됩니다.

Sampling rate: 48000 Hz

 

 

 

 

 

6. 데이터를 시계열(time-series)로 가져오기

input_audio, _ = librosa.load(file_name, sr=16000)

librosa라이브러리의 load함수를 이용해 음성파일을 시계열 데이터(time-series)로 가져옵니다.

 

인자로써 가져올 파일인 file_name과 Sampling rate인 sr=16000을 받습니다.

 

 

librosa.load 함수는 time-series 데이터와 Sampling rate를 반환합니다.

 

 

 

 

 

7. 음성인식 후 텍스트화 하기

input_values = tokenizer(input_audio, return_tensors="pt").input_values
logits = model(input_values).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = tokenizer.batch_decode(predicted_ids)[0]
print(transcription)

1) 음성파일을 tokenizer에 넣어 토큰화 합니다.

 

2) 토큰화한 데이터를 logit함수를 거쳐 데이터에 대한 확률을 구합니다.

( logit(로짓) 함수에 대해서는 추후 포스팅에서 자세히 다루겠습니다. 간단히 말하면 확률에 대해 모델링한 함수를 통과시키는 것입니다.)

 

3) pyTorch 라이브러리의 argmax를 사용합니다. logits함수에서 추출한 가장 높은 확률인 인자를 가져옵니다.

 

4) 입력 인덱스에 대해 토큰화 시켜 문장(Strings)로 재탄생 시켜주는 함수입니다.

 

 

 

 

 

'notebook.wav' 음성파일에 대한 output 출력결과는 아래와 같습니다.

I HAVE NO ONE SPECIAL JUST A COMMON MAN WITH COMMON THOUGHTS 
I'VE LED A COMMON LIFE THERE ARE NO MONUMENTS DEDICATED TO ME 
AND MY NAME WILL SOON BE FORGOTTEN BUT IN ONE RESPECT I'VE SUCCEEDED 
AS GLORIOUSLY AS ANY ONE WHO EVER LIVED I'VE LOVED ANOTHER WITH ALL MY HEART 
AND SOU AND FOR ME THAT HAS ALWAYS BEEN ENOUGH

 

 

이상으로 포스팅을 마치겠습니다.

 

감사합니다.