음성 인식 기능 알아보기

Speech-to-Text는 Google Distributed Cloud (GDC) 에어 갭에서 선행 학습된 세 가지 Vertex AI API 중 하나입니다. Speech-to-Text 서비스는 오디오 파일의 음성을 인식하고 오디오를 텍스트로 변환합니다. Speech-to-Text는 데이터 상주 및 규정 준수 요구사항을 충족합니다.

다음 표에서는 Speech-to-Text의 주요 기능을 설명합니다.

주요 기능
스크립트 작성 자동 음성 인식에 첨단 딥 러닝 신경망 알고리즘을 적용합니다.
모델 크기가 1GB 미만이며 리소스를 최소한으로 사용하는 인식 모델을 배포할 수 있습니다.
API 호환 Speech-to-Text API 및 클라이언트 라이브러리를 사용하여 오디오를 전송하고 Speech-to-Text 서비스에서 텍스트 스크립트를 수신합니다.

Speech-to-Text에 지원되는 오디오 인코딩

Speech-to-Text API는 다양한 인코딩을 지원합니다. 아래 표에는 지원되는 오디오 코덱이 나열되어 있습니다.

코덱 이름 무손실 사용 참고사항
FLAC 무료 무손실 오디오 코덱 예 스트림에 16비트 또는 24비트 필요
LINEAR16 리니어 PCM 예 16비트 선형 펄스 코드 변조(PCM) 인코딩. 헤더에는 샘플링 레이트가 포함되어야 합니다.
MULAW μ-law 아니요 8비트 PCM 인코딩
OGG_OPUS Ogg 컨테이너의 Opus 인코딩된 오디오 프레임 아니요 샘플링 레이트가 8000Hz, 12000Hz, 16000Hz, 24000Hz, 48000Hz 중 하나여야 함

FLAC는 오디오 코덱이자 오디오 파일 형식입니다. FLAC 인코딩을 사용하여 오디오 파일을 스크립트 작성하려면 메타데이터가 있는 헤더가 포함된 .FLAC 파일 형식으로 제공해야 합니다.

Speech-to-Text는 LINEAR16 또는 MULAW 인코딩 오디오가 있는 WAV 파일을 지원합니다.

Speech-to-Text 오디오 코덱에 대한 자세한 내용은 AudioEncoding 참고 문서를 확인하세요.

소스 자료를 인코딩할 때 선택할 수 있는 경우, 음성 인식 향상을 위해 FLAC 또는 LINEAR16과 같은 무손실 인코딩을 사용하세요.

Speech-to-Text 기능

Distributed Cloud의 Speech-to-Text에는 음성 인식을 수행하는 세 가지 방법이 있습니다.

  • 동기 인식: 오디오 데이터를 Speech-to-Text API로 보내고 해당 데이터에 대해 인식을 수행하고 오디오 처리 후 결과를 반환합니다. 동기식 인식 요청은 1분 이하의 오디오 데이터로 제한됩니다.

  • 비동기 인식: 오디오 데이터를 Speech-to-Text API로 보내고 장기 실행 작업을 시작합니다. 이 작업을 사용하여 주기적으로 인식 결과를 폴링할 수 있습니다. 최대 480분 길이의 오디오 데이터에는 비동기식 요청을 사용하세요.

  • 스트리밍 인식: 양방향 스트림에 제공되는 오디오 데이터를 인식합니다. 스트리밍 요청은 마이크에서 라이브 오디오 캡처 용도와 같은 실시간 인식 용도로 설계되었습니다. 스트리밍 인식은 오디오가 캡처되는 동안 중간 결과를 제공하므로 사용자가 계속 말하는 동안에도 결과가 표시될 수 있습니다.

요청에는 구성 파라미터와 오디오 데이터가 포함됩니다. 다음 섹션은 이러한 인식 요청, 요청이 생성하는 응답, 해당 응답 처리 방법을 자세하게 설명합니다.

동기식 요청 및 응답

Speech-to-Text 동기식 인식 요청은 음성 오디오 데이터 인식을 수행하는 가장 간단한 방법입니다. Speech-to-Text는 동기식 요청으로 전송된 음성 오디오 데이터(최대 1분 길이)를 처리할 수 있습니다. Speech-to-Text는 오디오를 모두 처리하고 인식한 후 응답을 반환합니다.

Speech-to-Text가 응답을 반환한 후에야 다음 요청을 처리할 수 있습니다. Speech-to-Text는 일반적으로 실시간보다 빠르게 오디오를 처리하며, 30초 길이의 오디오를 평균 15초 내에 처리합니다. 음질이 나쁘면 인식 요청을 처리하는 데 시간이 상당히 오래 걸릴 수 있습니다.

음성 인식 요청

동기식 Speech-to-Text API 요청은 음성 인식 구성과 오디오 데이터로 구성됩니다.

다음 예시에서는 동기 음성 인식 요청을 보내는 방법을 보여줍니다.

Python

import google.auth
from google.auth.transport import requests
from google.api_core.client_options import ClientOptions
from google.cloud import speech_v1p1beta1 as speech

audience = "https://ENDPOINT:443"
api_endpoint = "ENDPOINT:443"

try:
  creds, _ = google.auth.default()
  creds = creds.with_gdch_audience(audience)
  def_req = requests.Request()
  creds.refresh(def_req)
except Exception as e:
  print("Caught exception", e)
  raise e

client = speech.SpeechClient(
    credentials=creds,
    client_options=ClientOptions(api_endpoint=api_endpoint),
)

with open("SPEECH_FILE", "rb") as audio_file:
  content = audio_file.read()

audio = speech.RecognitionAudio(content=content)
config = speech.RecognitionConfig(
    encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=16000,
    audio_channel_count=1,
    language_code="en-US",
)

response = client.recognize(
    config=config,
    audio=audio,
    metadata=[("x-goog-user-project", "projects/PROJECT_ID")],
)
print(response)

다음을 바꿉니다.

  • ENDPOINT: 조직에 사용하는 Speech-to-Text 엔드포인트입니다. 자세한 내용은 서비스 상태 및 엔드포인트 보기를 참조하세요.
  • SPEECH_FILE: 스크립트를 작성할 오디오 파일의 경로입니다.
  • PROJECT_ID: 프로젝트 ID입니다.

curl (JSON)

Distributed Cloud에서 Speech-to-Text API 게이트웨이는 speech_v1p1beta1를 사용하여 gRPC를 제공하며 기본적으로 HTTP/JSON REST 트랜스코딩을 사용 설정하지 않습니다. Distributed Cloud에서 이전 Python speech_v1p1beta1 gRPC 클라이언트를 사용합니다.

HTTP/JSON 트랜스코딩이 사용 설정된 경우 요청 형식을 다음과 같이 지정합니다.

curl -X POST \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -H "x-goog-user-project: projects/PROJECT_ID" \
  --data '{
    "config": {
      "encoding": "FLAC",
      "sampleRateHertz": 16000,
      "languageCode": "en-US",
      "audioChannelCount": 1
    },
    "audio": {
      "content": "ZkxhQwAAACIQABAAAAUJABtAA+gA8AB+W8FZndQvQAyjv..."
    }
  }' \
  "https://ENDPOINT:443/v1p1beta1/speech:recognize"

다음을 바꿉니다.

모든 Speech-to-Text 동기식 인식 요청에는 RecognitionConfig 유형의 음성 인식 config 필드가 포함되어야 합니다. RecognitionConfig 객체에는 다음과 같은 필수 하위 필드가 포함됩니다.

  • encoding: 제공된 오디오의 인코딩 체계를 지정합니다. 이 필드는 AudioEncoding 유형입니다. 코덱을 선택할 수 있는 경우, 최상의 성능을 원한다면 FLAC 또는 LINEAR16과 같은 무손실 인코딩을 선택하는 것이 좋습니다. 지원되는 오디오 인코딩 형식 목록은 Speech-to-Text에 지원되는 오디오 인코딩을 참조하세요.
  • sample_rate_hertz: 제공된 오디오의 샘플링 레이트(Hz)(8000~48000)를 지정합니다. 샘플링 레이트에 대한 자세한 내용은 샘플링 레이트를 참조하세요. LINEAR16, FLAC, MULAW 인코딩 (WAV 파일 포함)의 경우 sample_rate_hertz 필드가 필요합니다.
  • audio_channel_count: 입력 오디오 데이터의 채널 수를 지정합니다 (1-8, 예: 모노 오디오의 경우 1). audio_channel_count 필드는 LINEAR16, FLAC, MULAW 오디오에 필요합니다.
  • language_code: 제공된 오디오의 음성 인식에 사용할 언어와 리전을 포함합니다. 언어 코드는 BCP-47 식별자여야 합니다. 언어 코드는 언어를 나타내는 기본 언어 태그와 보조 리전 하위 태그로 구성됩니다. 이 예시에서 en는 영어, US는 미국입니다. 지원되는 언어 목록은 지원되는 언어를 참조하세요.

config 필드에 포함할 수 있는 선택적 하위 필드에 대한 자세한 내용과 설명은 RecognitionConfig를 참조하세요.

RecognitionAudio 유형의 audio 파라미터를 통해 Speech-to-Text에 오디오를 제공합니다. audio 필드에는 다음 하위 필드가 포함됩니다.

  • content: 요청에 삽입된 형태의 평가 대상 오디오입니다. 오디오 데이터 바이트는 순수 바이너리 표현을 사용하여 인코딩됩니다. JSON 표현은 Base64를 사용합니다. 자세한 내용은 삽입된 오디오 콘텐츠를 참고하세요. 이 필드에서 직접 전달되는 오디오 길이는 1분으로 제한됩니다.

샘플링 레이트

요청 구성의 sample_rate_hertz 필드에서 오디오의 샘플링 레이트를 지정합니다. 이 샘플링 레이트는 관련된 오디오 콘텐츠의 샘플링 레이트와 일치해야 합니다. Speech-to-Text는 8000Hz와 48000Hz (8000~48000) 사이의 샘플링 레이트를 지원합니다. sample_rate_hertz 필드는 LINEAR16, FLAC, MULAW 인코딩 (WAV 파일 포함)에 필요합니다.

소스 자료를 인코딩할 때 선택할 수 있다면 16,000Hz 샘플링 레이트를 사용하여 오디오를 캡처하는 것이 좋습니다. 값이 이 값보다 낮으면 음성 인식 정확성이 손상될 수 있습니다. 레벨이 높아도 음성 인식 품질에 큰 영향을 주지 않습니다.

그러나 16,000Hz가 아닌 샘플링 레이트로 오디오 데이터를 녹음한 경우에는 오디오를 16,000Hz로 다시 샘플링하지 마세요. 예를 들어 대부분의 이전 전화 통신 오디오는 8,000Hz 샘플링 레이트를 사용하므로 결과 정확도가 떨어질 수 있습니다. 이러한 오디오를 사용해야 하는 경우, Speech-to-Text API에 원래 샘플링 레이트로 오디오를 제공합니다.

언어

Speech-to-Text의 인식 엔진은 다양한 언어와 방언을 지원합니다. BCP-47 식별자를 사용하여 요청 구성의 language_code 필드에서 오디오 언어 (그리고 국가 또는 지역 방언)를 지정합니다.

지원되는 언어 페이지에는 각 기능에 지원되는 언어의 전체 목록이 있습니다.

모델 선택

Speech-to-Text에 오디오 스크립트 작성 요청을 보낼 때 특정 소스 유형의 음성 오디오를 인식하도록 학습된 머신러닝 모델을 사용하여 오디오 파일을 처리할 수 있습니다.

Distributed Cloud에서 기본 음성 인식 모델을 사용하려면 RecognitionConfig 객체에서 model 필드를 생략하거나 model를 latest_long로 설정합니다. model를 default로 설정하지 마세요.

삽입된 오디오 콘텐츠

요청의 audio 필드 내에 content 파라미터를 전달하면 삽입된 오디오가 음성 인식 요청에 포함됩니다. REST 요청 내에서 콘텐츠로 제공되는 삽입된 오디오의 경우, 해당 오디오는 JSON 직렬화와 호환되어야 합니다.

오디오 데이터가 최대 60초 10MB인 경우에만 동기식 인식을 위해 content 필드에 데이터를 직접 보낼 수 있습니다. content 필드의 모든 오디오 데이터는 Base64 형식이어야 합니다.

클라이언트 라이브러리를 사용하여 요청을 작성하는 경우 이 바이너리 또는 Base64로 인코딩된 데이터를 content 필드에 직접 작성합니다.

대부분의 개발 환경에는 바이너리를 ASCII 텍스트 데이터로 인코딩하는 base64 유틸리티가 포함되어 있어 필요한 도구와 지원을 제공합니다. 또한 Python에는 Base64 인코딩 콘텐츠를 위한 기본 메커니즘이 있습니다. 다음 예시에서는 파일을 인코딩하는 방법을 보여줍니다.

Linux

base64 명령줄 도구를 사용하여 파일을 인코딩합니다. -w 0 플래그를 사용하여 줄바꿈을 방지합니다.

base64 INPUT_FILE -w 0 > OUTPUT_FILE

Python

Python에서 Base64는 다음과 같이 오디오 파일을 인코딩합니다.

# Import the base64 encoding library.
import base64

# Pass the audio data to an encoding function.
def encode_audio(audio):
  audio_content = audio.read()
  return base64.b64encode(audio_content)

음성 인식 응답

동기식 Speech-to-Text API 응답은 결과를 반환하는 데 시간이 걸릴 수 있습니다. 처리가 완료되면 API는 다음 예시와 같이 응답을 반환합니다.

{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "how old is the Brooklyn Bridge",
          "words": [
            {
              "word": "how"
            },
            {
              "word": "old"
            },
            {
              "word": "is"
            },
            {
              "word": "the"
            },
            {
              "word": "Brooklyn"
            },
            {
              "word": "Bridge"
            }
          ]
        }
      ]
    }
  ]
}

모든 Speech-to-Text API 동기식 인식 응답에는 RecognizeResponse 유형의 음성 인식 결과가 포함됩니다. RecognizeResponse 객체에는 다음 필드가 포함됩니다.

  • results: SpeechRecognitionResult 유형의 결과 목록이 포함됩니다. 여기서 각 결과는 특정 오디오 세그먼트에 해당됩니다. 각 결과는 다음 하위 필드 중 하나 이상으로 구성됩니다.

    • alternatives: SpeechRecognitionAlternative 형식의 변환 텍스트 목록이 포함됩니다. 응답의 첫 번째 대체 변환 텍스트는 항상 가능성이 가장 높습니다. 각 대체 변환 텍스트는 다음 하위 필드로 구성됩니다.

      • transcript: 변환 텍스트가 포함됩니다. 대체 변환 텍스트가 순차적으로 제공되면 이러한 변환 텍스트를 함께 연결할 수 있습니다.
      • words: 인식된 각 단어에 대한 단어별 정보 목록을 포함합니다.

자세한 내용은 RecognizeResponse를 참조하세요.

비동기식 요청 및 응답

비동기식 Speech-to-Text API 요청은 동기식 요청과 형식이 동일합니다. 하지만 비동기식 요청은 응답을 반환하는 대신 장기 실행 작업을 시작하고 이 작업을 즉시 반환합니다. 길이가 최대 480분인 오디오에 비동기식 음성 인식을 사용할 수 있습니다.

다음은 작업 응답의 예시입니다.

{
  "name": "OPERATION_NAME",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1p1beta1.LongRunningRecognizeMetadata",
    "progressPercent": 34,
    "startTime": "2016-08-30T23:26:29.579144Z",
    "lastUpdateTime": "2016-08-30T23:26:29.826903Z"
  }
}

아직 결과가 나타나지 않습니다. Speech-to-Text는 오디오를 계속 처리하고 이 작업을 사용하여 결과를 저장합니다. LongRunningRecognize 요청이 완료될 때 반환되는 작업의 response 필드에 결과가 표시됩니다.

다음은 요청 완료 후 전체 응답의 예시입니다.

{
  "name": "1268386125834704889",
  "metadata": {
    "lastUpdateTime": "2016-08-31T00:16:32.169Z",
    "@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeMetadata",
    "startTime": "2016-08-31T00:16:29.539820Z",
    "progressPercent": 100
  },
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeResponse",
    "results": [{
      "alternatives": [{
        "transcript": "how old is the Brooklyn Bridge",
        "words": [
            {
              "word": "how"
            },
            {
              "word": "old"
            },
            {
              "word": "is"
            },
            {
              "word": "the"
            },
            {
              "word": "Brooklyn"
            },
            {
              "word": "Bridge"
            }
          ]
      }]}]
  },
  "done": true
}

done이 true로 설정되었고 작업의 response에 SpeechRecognitionResult 유형의 결과 집합이 포함됩니다. 이 결과 유형은 동기식 인식 요청에서 반환되는 유형과 동일합니다.

스트리밍 요청 및 응답

스트리밍 Speech-to-Text API 인식 호출은 양방향 스트림 내에서 오디오의 실시간 캡처 및 인식을 위해 설계되었습니다. 애플리케이션은 요청 스트림에서 오디오를 보내고 응답 스트림에서 실시간 중간 및 최종 인식 결과를 받을 수 있습니다. 중간 결과는 오디오 섹션의 현재 인식 결과를 나타내고 최종 인식 결과는 해당 오디오 섹션에 대한 마지막 최적의 추측을 나타냅니다.

스트리밍 인식 요청

단일 요청 내에서 구성 및 오디오 모두 보내는 동기식 및 비동기식 호출과 달리 스트리밍 Speech-to-Text API를 호출하려면 요청을 여러 개 전송해야 합니다. 첫 번째 StreamingRecognizeRequest에는 StreamingRecognitionConfig 유형의 구성이 포함되어야 합니다.

StreamingRecognitionConfig는 config 필드로 구성되며, 이 필드에는 RecognitionConfig 유형의 오디오 구성 정보가 포함되어 있으며 동기식 및 비동기식 요청에 표시되는 것과 동일합니다.

스트리밍 인식 응답

스트리밍 음성 인식 결과는 StreamingRecognizeResponse 유형의 일련의 응답을 반환합니다. 이러한 응답은 다음 필드로 구성됩니다.

  • speech_event_type: SpeechEventType 유형의 이벤트를 포함합니다. 이러한 이벤트 값은 단일 발화가 완료된 시점을 나타냅니다. 음성 이벤트는 스트림 응답 내에서 마커로 작동합니다.
  • results: StreamingRecognitionResult 형식의 중간 또는 최종 결과인 결과 목록이 포함됩니다. results 목록에는 다음과 같은 하위 필드가 있습니다.
    • alternatives: 대체 변환 텍스트 목록이 포함됩니다.
    • is_final: 이 목록 항목에서 얻은 결과가 중간 또는 최종 결과인지 나타냅니다.
    • result_end_time: 오디오 시작을 기준으로 이 결과가 끝나는 시점의 타임스탬프를 나타냅니다.