

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 了解 Amazon Chime SDK 即時轉錄訊息
<a name="process-msgs"></a>

Amazon Chime SDK 服務透過在資料訊息中傳送`TranscriptEvent`物件，與出席者共用轉錄資訊。`TranscriptEvent` 提供 `Transcript`或 `TranscriptionStatus`。

`Transcript` 包含時間戳記、使用者歸屬單字和標點符號的結果。結果可能是「部分」，在這種情況下，系統通常會在後續的 中更新它`TranscriptEvent`。這可讓您快速查看轉錄，並在必要時稍後套用內嵌更新。

`TranscriptStatus` 可能會交付其中一個`TranscriptionStatusType`事件，列於下一節的範例。

較新版本的 Amazon Chime SDKs包含用於常見處理 的其他資料類型和協助程式函數`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` 如果內容符合篩選條件中的字詞，則為 true，否則為 false。

1. `transcription.results[i].alternatives[j].items[k].confidence` 是介於 0 和 1 之間的值。它表示引擎的可信度項目內容正確符合口語單字，0 表示可信度最低，1 表示可信度最高。

1. `transcription.results[i].alternatives[j].items[k].stable` 指出目前單字在未來的部分結果更新中是否會變更。只有在您透過在請求`true`中`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 引擎，並提供實體的子類型。這些是 `ADDRESS`、`CREDIT\$1DEBIT\$1NUMBER` 等值。

## 註冊 的事件處理常式 TranscriptEvents
<a name="register-handler"></a>

下列範例使用適用於 JavaScript 的 Amazon Chime SDK 用戶端程式庫。不過，模式在所有 Amazon Chime SDKs之間都是一致的。

`RealtimeController` 和 `TranscriptionController`中的 `RealtimeControllerFacade`包含用於新增處理常式的特定函數，可處理 `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`**  
我們提供名為 的`TranscriptionController`介面預設實作`DefaultTranscriptionController`。`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););
```