프로그래밍/AI

파이썬 AI 딥러닝 음성인식

에이티에스 2023. 8. 9. 11:05
728x90

말은 성인의 의사 소통의 가장 기본적인 수단입니다. 음성 처리의 기본 목표는 인간과 기계 간의 상호 작용을 제공하는 것입니다.

음성 처리 시스템은 주로 세 가지 작업을 가지고 있습니다 -

  • 첫째, 기계가 우리가 말하는 단어, 구 및 문장을 포착할 수 있도록 하는 음성 인식
  • 둘째, 기계가 우리가 말하는 것을 이해할 수 있도록 하는 자연어 처리,
  • 셋째, 기계가 말할 수 있도록 음성 합성.

 

음성 인식기 빌드

음성 인식 또는 자동 음성 인식(ASR)은 로봇 공학과 같은 AI 프로젝트의 관심 중심입니다. ASR이 없으면 인지 로봇이 인간과 상호 작용하는 것을 상상할 수 없습니다. 그러나 음성 인식기를 구축하는 것은 쉽지 않습니다.

 

음성 인식 시스템 개발의 어려움

고품질 음성 인식 시스템을 개발하는 것은 정말 어려운 문제입니다. 음성 인식 기술의 어려움은 광범위하게 아래에 논의 된 바와 같이 차원의 여러 따라 특징 지어 질 수있다 

 

  • 어휘의 크기 - 어휘의 크기는 ASR 개발의 용이성에 영향을 미칩니다. 더 나은 이해를 위해 다음과 같은 크기의 어휘를 고려하십시오.
  • 채널 특성 - 채널 품질도 중요한 차원입니다. 예를 들어, 사람의 음성은 전체 주파수 범위의 높은 대역폭을 포함하는 반면, 전화 음성은 주파수 범위가 제한된 낮은 대역폭으로 구성됩니다. 후자에서는 더 어렵습니다.
  • 말하기 모드 - ASR을 개발의 용이성은 말하기 모드, 즉 음성이 고립 된 단어 모드, 또는 연결된 단어 모드, 또는 연속 음성 모드에 있는지 여부에 따라 달라집니다. 연속적인 음성은 인식하기가 더 어렵습니다.
  • 말하기 스타일 - 읽기 연설은 공식적인 스타일이거나 캐주얼 스타일로 자발적이고 대화적인 것일 수 있습니다. 후자는 인식하기가 더 어렵습니다.
  • 화자 의존성 - 음성은 화자 의존적, 화자 적응 형 또는 화자 독립적 일 수 있습니다. 스피커 독립은 구축하기가 가장 어렵습니다.
  • 소음의 유형 - 소음은 ASR을 개발하는 동안 고려해야 할 또 다른 요소입니다. 신호 대 잡음비는 더 많은 배경 소음에 대한 더 적은 관찰 음향 환경에 따라 다양한 범위에있을 수 있습니다 -
  • 마이크 특성 - 마이크의 품질은 좋거나, 평균적이거나, 평균 이하일 수 있습니다. 또한 입과 마이크 사이의 거리가 다를 수 있습니다. 이러한 요소는 인식 시스템에서도 고려되어야 합니다.

이러한 어려움에도 불구하고 연구자들은 언어 신호, 화자 이해, 억양 식별과 같은 언어의 다양한 측면에 대해 많은 노력을 기울였습니다.

음성 인식기를 구축하기 위해 아래에 주어진 단계를 따라해야합니다 -

 

오디오 신호 시각화 - 파일에서 읽기 및 작업

이것은 오디오 신호가 어떻게 구성되는지에 대한 이해를 제공하기 때문에 음성 인식 시스템을 구축하는 첫 번째 단계입니다. 오디오 신호로 작업하기 위해 따를 수있는 몇 가지 일반적인 단계는 다음과 같습니다 -

 

녹음

파일에서 오디오 신호를 읽어야 하는 경우 먼저 마이크를 사용하여 녹음합니다.

견본 추출

마이크로 녹음 할 때 신호는 디지털화 된 형태로 저장됩니다. 그러나 이를 작업하려면 기계가 이산 숫자 형식으로 변환해야 합니다. 따라서 특정 주파수에서 샘플링을 수행하고 신호를 이산 숫자 형식으로 변환해야 합니다. 샘플링을 위해 고주파를 선택한다는 것은 인간이 신호를 들을 때 이를 연속적인 오디오 신호로 느낀다는 것을 의미합니다.

 

예시

다음 예제에서는 파일에 저장된 Python을 사용하여 오디오 신호를 분석하는 단계적 접근 방식을 보여 줍니다. 이 오디오 신호의 주파수는 44,100HZ입니다.

여기에 표시된대로 필요한 패키지를 가져옵니다 

 

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

 

이제 저장된 오디오 파일을 읽습니다. 샘플링 주파수와 오디오 신호의 두 가지 값을 반환합니다. 여기에 표시된대로 저장된 오디오 파일의 경로를 제공합니다 

 

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

 

표시된 명령을 사용하여 오디오 신호의 샘플링 주파수, 신호의 데이터 유형 및 지속 시간과 같은 매개 변수를 표시합니다.

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] / 
float(frequency_sampling), 2), 'seconds')

 

이 단계는 아래와 같이 신호를 정규화하는 것을 포함합니다.

audio_signal = audio_signal / np.power(2, 15)

 

이 단계에서는 이 신호에서 처음 100개의 값을 추출하여 시각화합니다. 이 목적을 위해 다음 명령을 사용합니다.

audio_signal = audio_signal [:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(frequency_sampling)

 

아래 주어진 명령을 사용하여 신호를 시각화합니다.

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time (milliseconds)')
plt.ylabel('Amplitude')
plt.title('Input audio signal')
plt.show()

아래 이미지와 같이 위의 오디오 신호에 대해 추출된 출력 그래프와 데이터를 볼 수 있습니다

Signal shape: (132300,)
Signal Datatype: int16
Signal duration: 3.0 seconds

 

오디오 신호 특성화: 주파수 영역으로 변환

오디오 신호의 특성화는 시간 영역 신호를 주파수 영역으로 변환하고 주파수 성분을 이해하는 것을 포함합니다. 이것은 신호에 대한 많은 정보를 제공하기 때문에 중요한 단계입니다. 푸리에 변환과 같은 수학 도구를 사용하여 이 변환을 수행할 수 있습니다.

 

예제

다음 예제에서는 파일에 저장된 Python을 사용하여 신호를 특성화하는 방법을 단계별로 보여줍니다. 여기서는 푸리에 변환 수학 도구를 사용하여 주파수 영역으로 변환합니다.

여기에 표시된대로 필요한 패키지를 가져옵니다

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

 

이제 저장된 오디오 파일을 읽습니다. 샘플링 주파수와 오디오 신호의 두 가지 값을 반환합니다. 여기에 명령에 표시된대로 저장되는 오디오 파일의 경로를 제공합니다.

frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")

이 단계에서, 우리는 오디오 신호의 샘플링 주파수, 신호의 데이터 유형 및 지속 시간과 같은 매개 변수를 표시합니다, 아래 주어진 명령을 사용하여 -

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] / 
float(frequency_sampling), 2), 'seconds')

 

이 단계에서,  다음 명령과 같이, 신호를 정규화해야합니다 -

audio_signal = audio_signal / np.power(2, 15)

 

이 단계에는 신호의 길이와 절반 길이를 추출하는 작업이 포함됩니다. 이 목적을 위해 다음 명령을 사용합니다.

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

 

이제 주파수 영역으로 변환하기 위한 수학 도구를 적용해야 합니다. 여기서는 푸리에 변환을 사용합니다.

signal_frequency = np.fft.fft(audio_signal)

 

지금, 주파수 영역 신호의 정규화를 수행하고 그것을 제곱합니다.

signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2

 

다음으로, 주파수 변환 신호의 길이와 절반 길이를 추출하십시오

.

len_fts = len(signal_frequency)

 

푸리에 변환 신호는 짝수 및 홀수 경우에 맞게 조정되어야 합니다.

if length_signal % 2:
   signal_frequency[1:len_fts] *= 2
else:
   signal_frequency[1:len_fts-1] *= 2

 

지금, decibal (dB)에서 파워를 추출합니다.

signal_power = 10 * np.log10(signal_frequency)

 

X 축에 대한 kHz 단위의 주파수를 조정합니다.

x_axis = np.arange(0, len_half, 1) * (frequency_sampling / length_signal) / 1000.0

 

다음과 같이 신호의 특성을 시각화 합니다.

plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()

 

아래 이미지와 같이 위의 코드의 출력 그래프를 관찰 할 수 있습니다 -

 

모노톤 오디오 신호 생성

지금까지 살펴본 두 단계는 신호에 대해 배우는 데 중요합니다. 이제 이 단계는 미리 정의된 매개변수로 오디오 신호를 생성하려는 경우에 유용합니다. 이 단계에서는 오디오 신호를 출력 파일에 저장합니다.

 

예시

다음 예에서는 파일에 저장될 Python을 사용하여 단조 신호를 생성할 것입니다. 이를 위해, 당신은 다음 단계를 수행해야합니다 -

그림과 같이 필요한 패키지를 가져옵니다 -

import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import write

 

출력 파일을 저장할 파일을 제공합니다.

output_file = 'audio_signal_generated.wav'

 

이제 그림과 같이 원하는 매개 변수를 지정하십시오

duration = 4 # in seconds
frequency_sampling = 44100 # in Hz
frequency_tone = 784
min_val = -4 * np.pi
max_val = 4 * np.pi

 

이 단계에서, 도시와 같이, 오디오 신호를 생성 할 수 있습니다 -

t = np.linspace(min_val, max_val, duration * frequency_sampling)
audio_signal = np.sin(2 * np.pi * tone_freq * t)

 

이제 출력 파일에 오디오 파일을 저장합니다 -

write(output_file, frequency_sampling, signal_scaled)

 

그림과 같이 그래프에 대한 처음 100 값을 추출합니다.

audio_signal = audio_signal[:100]
time_axis = 1000 * np.arange(0, len(signal), 1) / float(sampling_freq)

 

이제 다음과 같이 생성 된 오디오 신호를 시각화합니다.

plt.plot(time_axis, signal, color='blue')
plt.xlabel('Time in milliseconds')
plt.ylabel('Amplitude')
plt.title('Generated audio signal')
plt.show()

 

여기에 주어진 그림과 같이 플롯을 관찰 할 수 있습니다 -

 

음성에서 특징 추출

음성 신호를 주파수 영역으로 변환한 후 사용 가능한 형태의 특징 벡터로 변환해야 하기 때문에 음성 인식기를 구축하는 데 있어 가장 중요한 단계입니다. MFCC, PLP, PLP-RASTA 등과 같은 다양한 특징 추출 기술을 사용할 수 있습니다. 

 

예시

다음 예제에서는 MFCC 기술을 사용하여 Python을 사용하여 단계별로 신호에서 기능을 추출합니다.

여기에 표시된대로 필요한 패키지를 가져옵니다.

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from python_speech_features import mfcc, logfbank

 

이제 저장된 오디오 파일을 읽습니다. 샘플링 주파수와 오디오 신호의 두 가지 값을 반환합니다. 오디오 파일이 저장된 오디오 파일의 경로를 제공합니다.

frequency_sampling, audio_signal = wavfile.read("/Users/admin/audio_file.wav")

 

여기서는 분석을 위해 처음 15000개의 샘플을 채취합니다.

audio_signal = audio_signal[:15000]

 

MFCC 기술을 사용하고 MFCC 기능을 추출하기 위해 다음 명령을 실행합니다.

features_mfcc = mfcc(audio_signal, frequency_sampling)

 

이제 도시와 같이 MFCC 매개 변수를 인쇄하십시오..

print('\nMFCC:\nNumber of windows =', features_mfcc.shape[0])
print('Length of each feature =', features_mfcc.shape[1])

 

플롯 및 아래에 주어진 명령을 사용하여 MFCC 기능을 시각화합니다.

features_mfcc = features_mfcc.T
plt.matshow(features_mfcc)
plt.title('MFCC')

 

이 단계에서, 우리는 도시와 같이 필터 뱅크 기능으로 작업합니다.

필터 뱅크 기능을 추출하십시오

filterbank_features = logfbank(audio_signal, frequency_sampling)

 

이제 filterbank 매개 변수를 인쇄합니다.

print('\nFilter bank:\nNumber of windows =', filterbank_features.shape[0])
print('Length of each feature =', filterbank_features.shape[1])

 

이제 필터뱅크 특징을 플로팅하고 시각화합니다.

filterbank_features = filterbank_features.T
plt.matshow(filterbank_features)
plt.title('Filter bank')
plt.show()

 

위 단계의 결과로 MFCC의 경우 그림 1, 필터 뱅크의 경우 그림 2 출력을 확인할 수 있습니다

 

구어체 인식

음성 인식은 사람이 말할 때 기계가 이해하는 것을 의미합니다. 여기에서는 Python에서 Google Speech API를 사용하여 이를 실현합니다. 우리는 이것을 위해 다음 패키지를 설치해야합니다 -

  • Pyaudio - 그것은 pip 설치 Pyaudio 명령을 사용하여 설치할 수 있습니다.
  • SpeechRecognition -이 패키지는 pip install SpeechRecognition을 사용하여 설치할 수 있습니다.
  • 구글 - 음성 - API - 그것은 pip install google-api-python-client 명령을 사용하여 설치할 수 있습니다.

 

예시

말의 인식에 대해 이해하기 위해 다음 예를 참조하세요. 

그림과 같이 필요한 패키지를 가져옵니다.

import speech_recognition as sr

 

아래와 같이 개체를 만듭니다 -

recording = sr.Recognizer()

microphone() 모듈은 입력으로 음성을 수집합니다.

with sr.Microphone() as source: recording.adjust_for_ambient_noise(source)
   print("Please Say something:")
   audio = recording.listen(source)

 

이제 Google API가 음성을 인식하고 출력을 제공합니다.

try:
   print("You said: \n" + recording.recognize_google(audio))
except Exception as e:
   print(e)

 

다음과 같은 출력을 볼 수 있습니다 -

Please Say Something:
You said:

 

예를 들어, tutorialspoint.com 말했다면, 시스템은 다음과 같이 올바르게 인식합니다

tutorialspoint.com
728x90
반응형
그리드형