Setting the file. One moment.
Subchapter 149.14
examples/transcription.mdMarkdown14 KBView on GitHub
Complete guide to implementing live transcription in the Zoom Video SDK for Web.
// Get transcription client after joining session
const transcriptionClient = client.getLiveTranscriptionClient();try {
await transcriptionClient.startLiveTranscription();
console.log('Live transcription started');
} catch (error) {
console.error('Failed to start transcription:', error);
}const status = transcriptionClient.getLiveTranscriptionStatus();
console.log('Transcription enabled:', status.isLiveTranscriptionEnabled);
console.log('Caption language:', status.captionLanguage);
console.log('Translation settings:', status.translatedSetting);import { LiveTranscriptionLanguage } from '@zoom/videosdk';
// Set the language you're speaking
await transcriptionClient.setSpeakingLanguage(
LiveTranscriptionLanguage.English
);// Translate transcriptions to another language
await transcriptionClient.setTranslationLanguage(
LiveTranscriptionLanguage.Spanish
);
// Disable translation
await transcriptionClient.setTranslationLanguage(); // No argument// Listen for transcription text
client.on('caption-message', (payload) => {
const {
msgId, // Message ID
text, // Transcribed text
userId, // Speaker's user ID
displayName, // Speaker's display name
source, // 'caption' or 'translation'
language, // Language code
done, // true = final, false = interim
timestamp, // Unix timestamp
} = payload;
if (done) {
// Final transcription - display permanently
addFinalTranscription(displayName, text);
} else {
// Interim result - update in place
updateInterimTranscription(displayName, text);
}
});client.on('caption-status', (payload) => {
const {
autoCaption, // Auto-captioning enabled
language, // Caption language name
lang, // Language code
sessionLanguage, // Session's transcription language
translationStarted, // Translation active
} = payload;
console.log('Caption status:', payload);
});client.on('caption-enable', (isEnabled) => {
if (isEnabled) {
showCaptionUI();
} else {
hideCaptionUI();
}
});client.on('caption-language-lock', (isLocked) => {
if (isLocked) {
// Host has locked the transcription language
disableLanguageSelector();
} else {
enableLanguageSelector();
}
});client.on('caption-host-disable', (isDisabled) => {
if (isDisabled) {
console.log('Host has disabled captions');
hideCaptionUI();
}
});// Get full transcription history
const history = transcriptionClient.getFullTranscriptionHistory();
// May return Promise for large histories (100,000+ records)
if (history instanceof Promise) {
const records = await history;
displayHistory(records);
} else {
displayHistory(history);
}
// Get latest transcription
const latest = transcriptionClient.getLatestTranscription();
console.log('Latest:', latest);
// Get latest translation
const latestTranslation = transcriptionClient.getLatestTranslation();
console.log('Latest translation:', latestTranslation);// Get current transcription language
const transcriptionLang = transcriptionClient.getCurrentTranscriptionLanguage();
console.log('Transcription language:', transcriptionLang);
// Get current translation language
const translationLang = transcriptionClient.getCurrentTranslationLanguage();
console.log('Translation language:', translationLang);// Host can lock the transcription language
await transcriptionClient.lockTranscriptionLanguage(true); // Lock
await transcriptionClient.lockTranscriptionLanguage(false); // Unlock// Host can disable captions for everyone
await transcriptionClient.disableCaptions(true); // Disable
await transcriptionClient.disableCaptions(false); // Enableimport { LiveTranscriptionLanguage } from '@zoom/videosdk';
class TranscriptionManager {
constructor(client) {
this.client = client;
this.transcriptionClient = null;
this.transcriptions = [];
this.interimMap = new Map(); // Track interim results by speaker
this.onTranscriptionUpdate = null;
import React, { useState, useEffect, useRef } from 'react';
import { VideoClient, LiveTranscriptionLanguage } from '@zoom/videosdk';
interface TranscriptionEntry {
displayName: string;
text: string;
timestamp: number;
isFinal: boolean;
source: string;
}
interface TranscriptionProps {
// LiveTranscriptionLanguage enum
LiveTranscriptionLanguage.English
LiveTranscriptionLanguage.Spanish
LiveTranscriptionLanguage.French
LiveTranscriptionLanguage.German
LiveTranscriptionLanguage.Italian
LiveTranscriptionLanguage.Portuguese
LiveTranscriptionLanguage.Russian
LiveTranscriptionLanguage.Chinese
LiveTranscriptionLanguage.Japanese
LiveTranscriptionLanguage.Korean
// ... and moredone=false is interim (updating), done=true is finalstartLiveTranscription() to enablesetTranslationLanguage() if neededgetFullTranscriptionHistory() may return Promise| Event | When | Payload |
|---|---|---|
caption-message | Transcription text received | Text, speaker, done flag |
caption-status | Status changes | Language, enabled state |
caption-enable | Captions enabled/disabled | Boolean |
caption-language-lock | Language locked by host | Boolean |
caption-host-disable | Host disabled captions | Boolean |