

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Chime SDK 라이브 트랜스크립션 메시지 이해
<a name="process-msgs"></a>

Amazon Chime SDK 서비스는 `TranscriptEvent` 객체를 데이터 메시지로 전송하여 참석자에게 트랜스크립션 정보를 공유합니다. `TranscriptEvent`는 `Transcript` 또는 `TranscriptionStatus`를 전달합니다.

`Transcript`에는 타임스탬프가 표시되고 사용자 속성이 지정된 단어 및 문장 부호를 포함한 결과가 있습니다. 결과는 ‘부분적’일 수 있으며, 이 경우 시스템은 보통 후속 `TranscriptEvent`에서 이를 업데이트합니다. 이렇게 하면 트랜스크립션을 빠르게 확인하고 나중에 필요에 따라 인라인 업데이트를 적용할 수 있습니다.

`TranscriptStatus`는 다음 섹션의 예제에 나열된 `TranscriptionStatusType` 이벤트 중 하나를 전달할 수 있습니다.

최신 버전의 Amazon Chime SDK에는 `TranscriptEvent`의 일반적인 처리를 위한 추가 데이터 유형과 도우미 함수가 포함되어 있습니다.

## TranscriptEvent
<a name="transcript-event"></a>

이 예제는 일반적인 트랜스크립션 이벤트를 보여줍니다.

```
type TranscriptEvent = Transcript | TranscriptionStatus;

export class TranscriptEventConverter {
  static from(dataMessage: DataMessage): TranscriptEvent[] {
    // convert DataMessage to TranscriptEvents
    return ...
  }
}

export default class TranscriptionStatus {
    type: TranscriptionStatusType;
    eventTimeMs:                   number;
    transcriptionRegion:           string;
    transcriptionConfiguration:    string;
    message?:                      string;
}

enum TranscriptionStatusType {
    STARTED        =    'started',
    INTERRUPTED    =    'interrupted',
    RESUMED        =    'resumed',
    STOPPED        =    'stopped',
    FAILED         =    'failed',
}

export default class Transcript {
    results: TranscriptResult[];    // at least one
}

export class TranscriptResult {
    resultId:        string;
    isPartial:       boolean;
    startTimeMs:     number;
    endTimeMs:       number;
    alternatives:    TranscriptAlternative[];    // most confident first
    }

export default class TranscriptAlternative {
    items: TranscriptItem[];    // in start time order
    transcript: string; //concatenated transcript items
    entities?: TranscriptEntity[];
}

export default class TranscriptItem {
    type:                      TranscriptItemType;
    startTimeMs:               number;
    endTimeMs:                 number;
    attendee:                  Attendee;
    content:                   string;
    vocabularyFilterMatch?:    boolean;
    confidence?:               number;  
    stable?:                   boolean;
}

enum TranscriptItemType {
    PRONUNCIATION    =    'pronunciation',// content is a word
    PUNCTUATION      =    'punctuation',// content is punctuation
}

export default class TranscriptEntity {  
    category:       string;  
    confidence:     number;  
    content:        string;  
    endTimeMs:      number;  
    startTimeMs:    number;  
    type?:          string;
}

// This is an existing SDK model
export default class Attendee {
    attendeeId:        string;
    externalUserId:    string;
}
```

## 데이터 지침
<a name="data-guidelines"></a>

진행하면서 아래 지침을 유의하세요.

1. `transcription.results`에는 결과가 두 개 이상 있을 수 있습니다.

1. `transcription.results[i].isPartial = true`인 경우 전체 결과가 업데이트될 수 있습니다. 업데이트될 가능성이 높지만 보장하지는 않습니다. 업데이트는 동일한 `transcript.result[i].resultId`를 가집니다. 신뢰도가 낮은 트랜스크립션을 피하려면 일부 결과를 완전히 건너뛰면 됩니다. 지연 시간이 짧은 결과를 원하는 경우 결과를 일부만 표시한 다음 업데이트가 도착했을 때 완전히 덮어쓸 수 있습니다.

1. `transcription.results[i].alternatives`에는 항상 하나 이상의 항목이 포함됩니다. 항목이 두 개 이상 포함된 경우 가장 신뢰할 수 있는 항목은 목록의 첫 번째입니다. 대부분의 경우 `transcription.results[i].alternatives`의 첫 번째 항목을 취하고 나머지 항목을 무시할 수 있습니다.

1. `transcription.results[i].alternatives[j].items`에는 각 단어 또는 문장 부호에 대한 항목이 포함됩니다.

1. `transcription.results[i].alternatives[j].items[k].`의 콘텐츠는 말한 내용입니다.

1. `transcription.results[i].alternatives[j].items[k].attendee`는 콘텐츠의 사용자 속성(누구)입니다.

1. `transcription.results[i].alternatives[j].items[k].startTimeMs`는 콘텐츠의 ‘시기’입니다. 이를 통해 여러 사용자 참여한 사용자 속성이 지정된 트랜스크립션을 말한 단어 순서에 맞게 글자 그대로 렌더링할 수 있습니다.

1. `transcription.results[i].alternatives[j].items[k].endTimeMs` 필드는 일반적으로 무시할 수 있지만 누가 언제 무엇을 말했는지 완전하게 파악할 수 있도록 제공됩니다.

1. `transcription.results[i].alternatives[j].items[k].vocabularyFilterMatch`는 콘텐츠가 필터에 있는 단어와 일치하면 true이고, 그렇지 않으면 false입니다.

1. `transcription.results[i].alternatives[j].items[k].confidence`는 0에서 1 사이의 값입니다. 이는 항목 콘텐츠가 말한 단어와 정확히 일치한다는 엔진의 신뢰도를 나타내며, 0은 가장 낮은 신뢰도이고 1은 가장 높은 신뢰도입니다.

1. `transcription.results[i].alternatives[j].items[k].stable`에서는 향후 일부 결과 업데이트에서 현재 단어를 변경할지 여부를 나타냅니다. 이 값은 요청에서 `EnablePartialResultsStabilization`을 `true`로 설정하여 일부 결과 안정화 기능을 활성화한 경우에만 true일 수 있습니다.

1. `transcription.results[i].alternatives[j].entities`에는 콘텐츠 식별 또는 수정 기능이 탐지하는 각 엔터티에 대한 항목을 포함합니다. 콘텐츠 식별 또는 수정을 활성화한 경우에만 목록이 채워집니다. 엔터티는 개인 식별 정보 또는 개인 건강 정보와 같은 데이터일 수 있습니다. 트랜스크립션 중에 엔터티를 사용하여 관심 단어를 강조 표시하거나 조치를 취할 수 있습니다.

1. `transcription.results[i].alternatives[j].entities[k].category`는 엔터티의 범주입니다. 이는 요청에 제공된 ‘PII’ 또는 ‘PHI’와 같은 콘텐츠 식별 또는 수정 유형과 같습니다.

1. `transcription.results[i].alternatives[j].entities[k].confidence`는 특정 콘텐츠가 실제 엔터티인지 평가하는 엔진이 얼마나 강력한지 측정합니다. 이는 단어 자체의 정확성에 대해 엔진을 얼마나 신뢰할 수 있는지 측정하는 항목 수준 신뢰도와는 다릅니다.

1. `transcription.results[i].alternatives[j].entities[k].content`는 엔터티를 구성하는 실제 텍스트입니다. 주소와 같은 다양한 항목일 수 있습니다.

1. `transcription.results[i].alternatives[j].entities[k].startTimeMs`는 엔터티를 말하기 시작한 시간을 캡처합니다.

1. `transcription.results[i].alternatives[j].entities[k].endTimeMs`는 엔터티를 말하는 것을 마친 시간을 캡처합니다.

1. `transcription.results[i].alternatives[j].entities[k].type`은 대화 기록 엔진에서만 지원되며 엔터티의 하위 유형을 제공합니다. 이러한 값은 `ADDRESS`, `CREDIT\$1DEBIT\$1NUMBER` 등과 같은 값입니다.

## TranscriptEvents에 이벤트 핸들러 등록
<a name="register-handler"></a>

다음 예제는 JavaScript용 Amazon Chime SDK 클라이언트 라이브러리를 사용합니다. 하지만 패턴은 모든 Amazon Chime SDK에서 동일합니다.

`RealtimeController` 및 `RealtimeControllerFacade`의 `TranscriptionController`에는 `TranscriptionEvents`를 처리하는 핸들러를 추가하기 위한 특정 함수가 포함되어 있습니다.

```
/** 
 * Returns the [[TranscriptionController]] for this real-time controller. 
 */
readonly transcriptionController?: TranscriptionController;
```

`TranscriptionController`에는 `TranscriptionEvent` 콜백에 대한 구독 및 구독 취소를 관리하는 두 가지 함수가 있습니다.

```
import TranscriptEvent from './TranscriptEvent';

export default interface TranscriptionController {
  /**
   * Subscribe a callback to handle received transcript event
   */
  subscribeToTranscriptEvent(callback: (transcriptEvent: TranscriptEvent) => void): void;

  /** 
   * Unsubscribe a callback from receiving transcript event 
   */
  unsubscribeFromTranscriptEvent(callback: (transcriptEvent: TranscriptEvent) => void): void;
}
```

**선택 사항인 `TranscriptionController` 사용**  
`DefaultTranscriptionController`라는 `TranscriptionController` 인터페이스의 기본 구현을 제공하고 있습니다. `DefaultRealtimeController` 및 `DefaultAudioVideoFacade`에서의 기본 구현은 `DefaultTranscriptionController` 객체를 반환합니다.

```
/** 
get transcriptionController(): TranscriptionController {
   return this.realtimeController.transcriptionController;
}
```

또한 `DefaultRealtimeController`는 생성자에서 선택 사항인 `TranscriptionController` 객체를 가져옵니다. 그러면 `DefaultTranscriptionController` 동작을 덮어쓸 수 있습니다. 개발자 애플리케이션은 `AudioVideoFacade` 객체의 `TranscriptionController` 객체를 통해 하나 이상의 콜백을 구독 및 구독 취소합니다.

```
// Subscribe
this.audioVideo.transcriptionController?.subscribeToTranscriptEvent(this.transcriptEventHandler);

// Unsubscribe
this.audioVideo.transcriptionController?.unsubscribeFromTranscriptEvent(this.transcriptEventHandler););
```