실시간 스트리밍 인식 문제

Prev Next

Classic/VPC 환경에서 이용 가능합니다.

CLOVA Speech 서비스를 이용하면서 다음과 같은 상황을 겪을 수 있습니다. 질문과 답변을 확인하고 적절하게 조치해 주십시오.

gRPC 커넥션 관리 방식 안내

gRPC 연결 시 권장되는 커넥션 관리 방법이 있는지 알고 싶습니다.

해결 방법

  1. 음성 인식을 모두 마치면 gRPC 커넥션을 종료하는 방식으로 채널을 관리하는 것을 권장합니다.

    • 채널은 channel.shutdown, channel.close 등 언어별 gRPC 메서드로 종료합니다. 자세한 예제는 실시간 스트리밍 인식을 참조해 주십시오.
    • 음성 인식 요청이 이어지는 하나의 스트림 동안 채널 커넥션을 유지합니다.
      • <예시> 라이브 방송의 경우, 라이브 방송이 종료되는 시점에 gRPC 커넥션 종료
  2. 음성 인식 데이터의 송수신 여부에 따라 타임아웃 로직을 적용하는 것을 권장합니다.

    • 송수신이 없는 상태로 커넥션을 계속 유지하면 gRPC 채널을 얻지 못할 수 있습니다.

gRPC 서비스의 Connection Lifetime 제한 여부

gRPC 서비스의 Connection Lifetime(서버와 클라이언트의 연결 지속 시간)에 제한이 있는지 알고 싶습니다.

해결 방법

gRPC 서비스는 Connection Lifetime 제한을 5분으로 설정하고 있으나 네트워크 문제 등으로 끊김이 발생할 수 있으므로 안정적인 서비스 이용을 위해 retry(재연결) 로직 반영을 권장합니다.

gRPC 서비스 일시 정지 기능 지원 여부

gRPC 서비스에서 일시 정지 기능을 지원하는지 알고 싶습니다.

해결 방법

일시 정지 기능은 제공하지 않습니다. 그러나 인식(Recognize) API에서 extraContents 필드의 epFlag 항목을 true로 설정하고 요청을 전송한 뒤, 일정 시간 동안 인식(Recognize) 요청을 보내지 않는 방법으로 구현할 수 있습니다. epFlag 항목의 자세한 설명은 CLOVA Speech 실시간 스트리밍 API를 참조해 주십시오.

  • epFlag를 true로 설정하지 않고 인식(Recognize)를 요청하다가 일정 시간 동안 재요청을 하지 않을 경우, 서버 내부에서 설정된 unvoiceTime(10초)을 기반으로 버퍼링되어 있는 인식 요청을 처리하여 응답 결과를 표시합니다.

extraContents 필드 내 epFlag, seqId 용도

인식(Recognize) API의 extraContents 필드에서 epFlag와 seqId의 용도를 알고 싶습니다.

해결 방법

일시 정지를 목적으로 활용하거나, 보낸 요청에 대한 응답을 다 받았는지 확인하는 용도로 사용할 수 있습니다.

모든 응답 회신 여부

보낸 요청에 대한 모든 응답을 받았는지 확인하고 싶습니다.

해결 방법

인식(Recognize) API를 호출할 때, extraContents 필드의 epFlag와 seqId 항목을 활용할 수 있습니다. epFlag 항목을 true로 설정하고, seqId 항목을 0이 아닌 임의의 값으로 설정한 인식(Recognize) 요청의 처리 결과는 인식(Recognize) 응답의 epFlag, seqId를 비교함으로써 확인할 수 있습니다. 자세한 설명은 CLOVA Speech 실시간 스트리밍 API의 응답 바디를 참조해 주십시오.

종료(Close) API 호출 전 epFlag 값 true 필수 여부

종료(Close) API를 호출하기 전에 인식(Recognize) API의 extraContents에서 epFlag 항목을 반드시 true로 설정해야 하는지 알고 싶습니다.

해결 방법

반드시 epFlag 항목을 true로 설정할 필요는 없습니다. 그러나 마지막 인식(Recognize) 요청에 대해 응답 결과를 빠르게 받으려면 epFlag 항목을 true로 설정하는 것을 권장합니다. epFlag 항목에 대한 자세한 설명은 CLOVA Speech 실시간 스트리밍 API를 참조해 주십시오.

인식(Recognize) API 음원 데이터 형식

인식(Recognize) API에서 사용하는 음원 데이터 형식을 알고 싶습니다.

해결 방법

16kHz, 1 channel, 16 bits per sample의 PCM (헤더가 없는 raw wave) 형식만 지원합니다.

text가 빈 값으로 수신되는 경우

실시간 스트리밍 인식에서 text가 빈 값으로 수신되는 경우의 의미를 알고 싶습니다.

해결 방법

오류가 아니라 해당 구간에서 인식된 음절이 없음을 나타내는 정상 응답입니다. 빈 값 응답에는 confidence 기본값 1이 부여됩니다.

빈 값 응답 수신을 원하지 않는 경우 semanticEpd.skipEmptyText를 true로 설정합니다. 기본값은 false이며 semanticEpd 객체 하위에 지정해야 합니다.

인식 결과가 반복적으로 끊기거나 unvoice로 응답되는 경우

실제 무음이 없는데 인식 결과가 반복적으로 끊기고 epdType이 unvoice로 응답되는 원인을 알고 싶습니다.

해결 방법

서버는 수신한 오디오를 실시간 속도로 인식 모델에 전달하며, unvoiceTime(10초)은 클라이언트 메시지 한 건의 처리가 완료되는 시점을 기준으로 초기화됩니다. 10초 분량을 한 번에 전송하면 메시지 한 건을 처리하는 데 약 10초가 소요되므로, 실제 무음이 없어도 발화가 강제 종료되고 epdType이 unvoice인 응답이 반복됩니다. 강제 종료 시점에 인식 문맥이 초기화되어 경계에 걸친 단어는 인식 정확도가 떨어지거나 일부가 누락될 수 있습니다.

다음과 같이 전송해 주십시오.

  1. 0.1~0.4초 단위의 작은 청크로 나누어 전송합니다. 16 kHz, 1 channel, 16 bits per sample 기준 0.4초는 12,800바이트입니다.
  2. 청크는 실시간 속도로 균일하게 전송합니다. 오디오를 내부 버퍼에 쌓고, 버퍼에서 실시간 간격으로 꺼내 전송하는 방식을 권장합니다.
  3. 무음 구간과 음악 구간에도 전송을 중단하지 않습니다.

unvoiceTime은 서버 공통 설정이므로 클라이언트에서 조정할 수 없습니다.

음악 구간에서 인식 결과가 생성되지 않는 경우

보컬이 포함된 음악 구간에서 인식 결과가 생성되지 않는 이유를 알고 싶습니다.

해결 방법

인식 모델은 음악 신호를 보컬 포함 여부와 관계없이 묵음으로 처리하도록 학습되어 있습니다. 음악 구간에서는 인식 결과가 생성되지 않으며 epdType이 gap인 빈 값 응답으로 반환될 수 있습니다.

보컬이 두드러지는 구간에서는 가사가 부분적으로 인식될 수 있으나, 음악 구간의 인식은 품질 보장 범위에 포함되지 않습니다.