WebSocket 인터페이스
WebSocket 연결이 확립된 후, 텍스트 메시지로 음성 인식 요청을 수행하고 순차적으로 응답을 받을 수 있습니다. 실시간으로 녹음되는 음성 스트림 등 음성 데이터를 조금씩 전송하고 인식 결과를 순차적으로 얻을 수 있습니다.
다음과 같은 단계로 처리를 수행합니다.
WebSocket 인터페이스의 세부사항을 숨기고 간단하게 실시간 음성 인식 애플리케이션을 만들기 위한 클라이언트 라이브러리를 제공하고 있습니다. 사용 방법은 실시간 음성 인식 라이브러리 Wrp 사용법을 참조하십시오.
음성 스트리밍을 사용한 애플리케이션은 WebSocket 연결 후 명령어와 명령어 응답(s, p, e), 서버 처리에 따른 이벤트(S, E, C, U, A)를 받아 구현을 수행합니다. 일반적인 흐름은 다음과 같습니다.
이하에서는 단계별로 구현 방법을 설명합니다. 명령어와 명령어 응답(s, p, e), 서버 처리에 따른 이벤트(S, E, C, U, A)의 세부 사항, 응답에 대해서는 스트리밍 응답을 참조하십시오.
사용 방법
1. WebSocket 연결
WebSocket으로 음성 인식 서버에 연결합니다. 이때 다음 두 개의 엔드포인트 중 하나를 선택하여 로그 저장을 허용할지 여부를 선택할 수 있습니다.
wss://acp-api.amivoice.com/v1/ (로그 저장 있음)
wss://acp-api.amivoice.com/v1/nolog/ (로그 저장 없음)
로그 저장에 대해서는 로그 저장을 참조하십시오.
로그를 저장하지 않는 엔드포인트(…/nolog/)는 반드시 끝에 슬래시(/)가 포함되어야 합니다. 슬래시가 누락되면 일반 엔드포인트로 간주되어 로그가 저장되므로 설정 시 각별히 주의가 필요합니다.
(올바른 예) wss://acp-api.amivoice.com/v1/nolog/ (로그 저장 없음)
(잘못된 예) wss://acp-api.amivoice.com/v1/nolog (로그 저장 있음)
서버와의 통신은 텍스트 메시지로 이루어집니다. 여기서는 Python을 사용한 코드로 설명하지만, 다른 언어에서도 마찬가지로 WebSocket 연결이 확립된 후에는 텍스트 메시지의 송수신을 통해 실시간 음성 인식을 수행할 수 있습니다.
여기서는 WebSocket을 쉽게 다루기 위해 Python의 websocket-client 라이브러리를 사용합니다. AmiVoice API의 WebSocket 인터페이스의 로그 저장 있음 엔드포인트에 WebSocket으로 연결합니다. 서버와 WebSocket 연결이 확립되었을 때 on_open이 호출되고, 서버로부터 메시지를 받았을 때 on_message가 호출됩니다. 이 메서드에 처리를 추가하면서 음성 인식 서버와의 통신을 설명합니다.
import websocket
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(threadName)s %(message)s")
def on_open(ws):
logger.info("open")
def on_message(ws, message):
logger.info(f"message: {message}")
def on_close(ws):
logger.info("close")
ws = websocket.WebSocketApp('wss://acp-api.amivoice.com/v1/',
on_open=on_open,
on_message=on_message,
on_close=on_close)
ws.run_forever()
기반 시스템이 매우 혼잡한 경우, 아주 드물게 WebSocket 연결이 실패할 수 있습니다. 이 경우 연결에 성공할 때까지 여러 번 재시도하십시오.
2. 음성 인식 요청
WebSocket 연결에 성공하면 s 명령어를 전송합니다. s 명령어는 다음 형식입니다.
s <audio_format> <grammar_file_names> <key>=<value> ...
audio_format에는 해당 세션에서 전송할 음성의 음성 포맷을 지정합니다. grammar_file_name에는 요청 파라미터의 연결 엔진 이름을 지정합니다. 이어서 <key>=<value> 형식으로 인증 정보(authorization)를 authorization={APPKEY}와 같이 설정합니다. <key>=<value>에는 기타 요청 파라미터를 설정할 수 있습니다.
샘플에 포함된 음성 파일(test.wav)을 범용 엔진(-a-general)을 사용하여 음성 인식하는 것을 고려해 봅시다. 이 음성 파일은 샘플링 레이트 16kHz, wav 컨테이너 파일이므로 audio_format에 16K를 지정합니다. 자세한 내용은 헤더가 있는 음성 파일의 경우를 참조하십시오. grammar_file_name에는 가장 범용적으로 사용할 수 있는 -a-general을 설정합니다. WebSocket 연결 시의 핸들러 on_open에는 다음과 같은 코드를 추가합니다.
APPKEY='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
def on_open(ws):
logger.info("open")
command = f"s 16K -a-general authorization={APPKEY}"
logger.info(f"send> {command}")
ws.send(command)
기타 요청 파라미터를 설정하려면 <key1>=<value1> <key2>=<value2>... 형식으로 s 명령어에 추가합니다. 여기서는 "あのー" 또는 "えーっと" 등의 불필요한 단어를 일부러 표시하는 keepFillerToken, 업데이트 이벤트의 전송 타이밍 resultUpdatedInterval을 변경하여 1초로 설정하도록 s 명령어 줄에 2개의 파라미터를 추가합니다.
def on_open(ws):
logger.info("open")
command = f"s 16K -a-general authorization={APPKEY} keepFillerToken=1 resultUpdatedInterval=1000"
logger.info(f"send> {command}")
ws.send(command)
요청 파라미터에 설정하는 값에 공백이 포함된 경우에는 value를 "value"와 같이 큰따옴표로 감싸주십시오. 예를 들어, segmenterProperties에 여러 파라미터를 설정하는 경우 다음과 같이 합니다.
segmenterProperties="useDiarizer=1 diarizerAlpha=1e-20 diarizerTransitionBias=1e-10"
on_open은 다음과 같이 됩니다.
def on_open(ws):
logger.info("open")
command = f"s 16K -a-general authorization={APPKEY} segmenterProperties=\"useDiarizer=1 diarizerAlpha=1e-20 diarizerTransitionBias=1e-10\""
logger.info(f"send> {command}")
ws.send(command)
자세한 내용은 레퍼런스의 s 명령어 패킷을 참조하십시오.
응답
음성 인식 요청을 수락하면 서버는 텍스트 메시지, s 명령어 응답 패킷을 반환합니다.