

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 了解 Amazon Chime SDK 实时转录消息
<a name="process-msgs"></a>

Amazon Chime SDK 服务通过在数据消息中发送 `TranscriptEvent` 对象，与与会者共享转录信息。`TranscriptEvent` 传递 `Transcript` 或 `TranscriptionStatus`。

`Transcript` 包括带有时间戳、用户归属单词和标点符号的结果。结果可能是“部分的”，在这种情况下，系统通常会在后续 `TranscriptEvent` 中对其进行更新。这使您可以快速查看转录，并在以后根据需要应用内联更新。

`TranscriptStatus` 可能会传递其中一个 `TranscriptionStatusType` 事件，如以下部分示例中所列。

较新版本的 Amazon Chime SDKs 包括用于常见处理的其他数据类型和辅助函数 a. `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` 为内容的“时间”。这样可以按照单词的说话顺序在不同的用户之间 word-by-word呈现用户归因的转录。

1. 通常可以忽略 `transcription.results[i].alternatives[j].items[k].endTimeMs` 字段，但该字段旨在完整说明谁在何时说了什么内容。

1. 如果内容与过滤器中的单词匹配，则 `transcription.results[i].alternatives[j].items[k].vocabularyFilterMatch` 为真，否则为假。

1. `transcription.results[i].alternatives[j].items[k].confidence` 是 0 到 1 之间的值。它表示引擎对项目内容与所说单词正确匹配的置信度，其中 0 表示置信度最低，1 表示置信度最高。

1. `transcription.results[i].alternatives[j].items[k].stable` 表示当前单词是否会在后续部分结果更新中发生变化。仅当您在请求中将 `EnablePartialResultsStabilization` 设置为 `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` 仅支持 Transcribe 引擎并提供实体的子类型。这些是诸如“地址”、“CREDIT\$1DEBIT\$1NUMBER”等值。

## 为 TranscriptEvents 注册事件处理程序
<a name="register-handler"></a>

以下示例使用适用于 Amazon Chime 软件开发工具包的客户端库。 JavaScript但是，所有亚马逊 Ch SDKs ime 的模式都是一致的。

`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););
```