/////
Search
Duplicate
🏑

음성 입력 스트리밍방식

스트림과 파일의 차이

파일은 mp3처럼 4분 30초 짜리 음원 데이터 전체가 기록이 있다.
따라서 고정되어 있는 크기의 데이터를 처음부터 끝까지 읽어서 처리할 수 있다.
하지만 스트림은 파일과는 다르다.
스트림이란 계속해서 흘러 들어오는 데이터를 의미한다.
즉, 마이크에 대고 하는 이야기나, 비디오 카메라로 찍는 동영상처럼
입력장치를 통해 계속해서 들어오는 데이터의 흐름을 의미한다.

버퍼(Buffer)란?

버퍼는 일반적으로는 스트림 데이터를 조금씩 읽고, 저장하고, 처리하고, 비우기를 반복하는 메모리 공간이다.
이런 행위를 버퍼링이라고 하며, 임시로 데이터를 저장하는 메모리 공간 혹은 데이터 자체를 버퍼라고 한다.
(일반적으로 RAM메모리의 일부공간이 버퍼를 위해 사용된다.)
Buffer란 특정 용도로 활용하기 위해 임시로 저장하는 Binary 형태의 데이터 저장 객체이다.

음성 실시간 입력

음성을 실시간으로 입력 받는 방식
인코더를 활용하여 받은 신호를 pcm파일이나 wav파일로 변환하여 주는 것이다.
이것이 이제 실시간으로 바로바로 송출되게 만들어주는 기술이다.
파이썬은 음성입력 자체를 pyaudio라는 라이브러리를 활용하여 지원하고 있다.
여기서 우리는 버퍼를 설정하여 주고 음성을 실시간으로 받는 것처럼 나오게 설정할 예정이다.
방법 1 while문 응용하여 말이 나오면 출력되게 반복(필요없는 거짓값들이 많이 생김 기각)
방법 2 짧은 단위로 끊어서 글자를 출력해주기 (3~5초정도)
방법 3 외부 API를 당겨와서 사용하기(EX 구글 클라우드 )

테스트용 실시간 음성 말할시 볼륨 측정

인코더 활용법 pyaudio기반
import pyaudio import numpy as np CHUNK = 1024 RATE = 44100 p=pyaudio.PyAudio() stream=p.open(format=pyaudio.paInt16,channels=1,rate=RATE,input=True, frames_per_buffer=CHUNK,input_device_index=2) while(True): data = np.fromstring(stream.read(CHUNK),dtype=np.int16) if(int(np.average(np.abs(data)))>250):// 볼륨 측정 print(int(np.average(np.abs(data)))) stream.stop_stream() stream.close() p.terminate()
Python
복사

wav파일로 1초 당 녹음하기

1초 단위로 음성 말하는 걸 저장하여 줄 수 있는 프로그램 테스트 용이라 반복문을 쓰지 않고
한번만 저장하게 끔 설정하였다.
import pyaudio import wave CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100 RECORD_SECONDS = 1 WAVE_OUTPUT_FILENAME = "output.wav"//저장명 p = pyaudio.PyAudio()//파이오디오 자체 녹음 stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("Start to record the audio.") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("Recording is finished.") stream.stop_stream() stream.close() p.terminate() wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')//스트리밍된거 오디오 파일로 저장 wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close()
Python
복사

출력하기 (STT)

음성 파일이 아닌 실시간 음성 STT코드이다 단 이건 외부 API 활용
한번에 5초 정도 받아오면 MIC와 GLC등 여러 API를 사용가능하다.
import speech_recognition as sr import pyaudio r = sr.Recognizer() with sr.Microphone() as source: print('Speack Anything :') audio = r.listen(source) try: text = r.recognize_google(audio) print('You said : {}'.format(text)) except: print('Sorry could not recignize your voice')
Python
복사
출력하는데 사용하는 파이썬 라이브러리들

0.1 파이썬 라이브러리

오디오 데이터를 다루는데 자주 사용되는 파이썬 라이브러리는 다음과 같다.
CMU Sphinx, BSD 허가서
Kaldi, Apache License v.2
recognize_bing(): Microsoft Bing Speech
recognize_google(): Google Web Speech API
recognize_google_cloud(): Google Cloud Speech (google-cloud-speech 팩키지 설치 필요)
recognize_houndify(): Houndify by SoundHound
recognize_ibm(): IBM Speech to Text
recognize_sphinx(): CMU Sphinx (PocketSphinx 설치 필요)
recognize_wit(): Wit.ai
코랩에서 deepspeech를 활용한 파일 텍스트로 바꿈

참조 자료들