JavaScript SDK

Scribe:JavaScriptでのリアルタイムスピーチtoテキスト文字起こし

Scribeの概要と機能については、スピーチtoテキストの 概要をご覧ください。ステップごとの使用ガイドについては、クライアント側 ストリーミングをご覧ください。

インストール

npm install @elevenlabs/client
# or
yarn add @elevenlabs/client
# or
pnpm install @elevenlabs/client

AIコーディングアシスタントでオーディオを書き起こすには、ElevenLabs speech-to-text skillを使用します。

npx skills add elevenlabs/skills --skill speech-to-text

このライブラリは、JavaScriptベースのあらゆるプロジェクトで使用できます。Reactを使用している場合は、 状態管理とライフサイクル処理が組み込まれた useScribeフックをご検討ください。

使用方法

Scribeに接続し、文字起こし結果をログに出力する最小限の動作例を示します。

import { Scribe, RealtimeEvents } from "@elevenlabs/client";
const token = await fetchTokenFromServer();
const connection = Scribe.connect({
token,
modelId: "scribe_v2_realtime",
microphone: {
echoCancellation: true,
noiseSuppression: true,
},
});
connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
console.log("Partial:", data.text);
});
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
console.log("Committed:", data.text);
});
// Later, close the connection
connection.close();

トークンの取得

Scribeでは、認証に1回限りのトークンが必要です。サーバーにAPIエンドポイントを作成します。

// Node.js server
app.get("/scribe-token", yourAuthMiddleware, async (req, res) => {
const response = await fetch("https://api.elevenlabs.io/v1/single-use-token/realtime_scribe", {
method: "POST",
headers: {
"xi-api-key": process.env.ELEVENLABS_API_KEY,
},
});
const data = await response.json();
res.json({ token: data.token });
});

ElevenLabs APIキーは機密情報です。クライアントに公開しないでください。トークンは必ず サーバー上で生成してください。

// Client
const fetchToken = async () => {
const response = await fetch("/scribe-token");
const { token } = await response.json();
return token;
};

接続オプション

Scribe.connect()は、マイクオプションまたは手動オーディオオプションを受け取ります。どちらも共通の基本オプションを使用します。

基本オプション

プロパティ型デフォルト説明
tokenstringWebSocket認証用の1回限りのトークン。
modelIdstringモデルID(例:"scribe_v2_realtime")。
baseUristring"wss://api.elevenlabs.io"カスタムWebSocketベースURI。
commitStrategyCommitStrategy"manual""manual"または"vad"。
vadSilenceThresholdSecsnumber1.5VADがコミットするまでの無音時間(秒)(0.3~3.0)。
vadThresholdnumber0.4VADの感度(0.1~0.9。値が小さいほど高感度)。
minSpeechDurationMsnumber100最小発話時間(ms)(50~2000)。
minSilenceDurationMsnumber100最小無音時間(ms)(50~2000)。
languageCodestringISO-639-1またはISO-639-3の言語コード。自動検出する場合は空欄のままにします。
includeTimestampsbooleanfalseCOMMITTED_TRANSCRIPT_WITH_TIMESTAMPSイベントで単語レベルのタイムスタンプを受け取ります。

マイクオプション

ユーザーのマイクから直接オーディオをストリーミングするには、microphoneオブジェクトを渡します。接続がgetUserMediaとオーディオエンコードを自動的に処理します。

const connection = Scribe.connect({
token,
modelId: "scribe_v2_realtime",
microphone: {
deviceId: "optional-device-id",
echoCancellation: true,
noiseSuppression: true,
autoGainControl: true,
},
});
プロパティ型説明
deviceIdstring特定のマイクデバイスID。
echoCancellationbooleanエコーキャンセルを有効化。
noiseSuppressionbooleanノイズ抑制を有効化。
autoGainControlboolean自動ゲイン制御を有効化。

手動オーディオオプション

connection.send()を使って手動でオーディオデータを送信するには、audioFormatとsampleRateを渡します。

import { AudioFormat } from "@elevenlabs/client";
const connection = Scribe.connect({
token,
modelId: "scribe_v2_realtime",
audioFormat: AudioFormat.PCM_16000,
sampleRate: 16000,
});
プロパティ型説明
audioFormatAudioFormatオーディオエンコード形式(例:AudioFormat.PCM_16000)。
sampleRatenumberサンプルレート(Hz)。audioFormatと一致する必要があります。

AudioFormat列挙型

enum AudioFormat {
PCM_8000 = "pcm_8000",
PCM_16000 = "pcm_16000",
PCM_22050 = "pcm_22050",
PCM_24000 = "pcm_24000",
PCM_44100 = "pcm_44100",
PCM_48000 = "pcm_48000",
ULAW_8000 = "ulaw_8000",
}

マイクモード

ユーザーのマイクから直接オーディオをストリーミングします。

import { Scribe, RealtimeEvents } from "@elevenlabs/client";
async function transcribeFromMicrophone() {
const token = await fetchToken();
const connection = Scribe.connect({
token,
modelId: "scribe_v2_realtime",
microphone: {
echoCancellation: true,
noiseSuppression: true,
autoGainControl: true,
},
});
connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
document.getElementById("live").textContent = data.text;
});
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
const el = document.createElement("p");
el.textContent = data.text;
document.getElementById("transcripts").appendChild(el);
document.getElementById("live").textContent = "";
});
document.getElementById("stop").addEventListener("click", () => {
connection.close();
});
}

手動オーディオモード(ファイルの文字起こし)

オーディオデータを手動で送信して、録音済みのオーディオファイルを書き起こします。

import { Scribe, RealtimeEvents, AudioFormat } from "@elevenlabs/client";
async function transcribeFile(file) {
const token = await fetchToken();
const connection = Scribe.connect({
token,
modelId: "scribe_v2_realtime",
audioFormat: AudioFormat.PCM_16000,
sampleRate: 16000,
});
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
console.log("Transcript:", data.text);
});
// Decode audio file
const arrayBuffer = await file.arrayBuffer();
const audioContext = new AudioContext({ sampleRate: 16000 });
const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);
// Convert to PCM16
const channelData = audioBuffer.getChannelData(0);
const pcmData = new Int16Array(channelData.length);
for (let i = 0; i < channelData.length; i++) {
const sample = Math.max(-1, Math.min(1, channelData[i]));
pcmData[i] = sample < 0 ? sample * 32768 : sample * 32767;
}
// Send in chunks
const chunkSize = 4096;
for (let offset = 0; offset < pcmData.length; offset += chunkSize) {
const chunk = pcmData.slice(offset, offset + chunkSize);
const bytes = new Uint8Array(chunk.buffer);
const base64 = btoa(String.fromCharCode(...bytes));
connection.send({ audioBase64: base64 });
await new Promise((resolve) => setTimeout(resolve, 50));
}
// Commit and close
connection.commit();
}

RealtimeConnection

Scribe.connect()は、以下のメソッドを持つRealtimeConnectionインスタンスを返します。

on(event, listener)

イベントリスナーを登録します。利用可能なイベントタイプについては、イベントを参照してください。

connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
console.log("Committed:", data.text);
});

off(event, listener)

以前に登録したイベントリスナーを削除します。

const handler = (data) => console.log(data.text);
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, handler);
// Later
connection.off(RealtimeEvents.COMMITTED_TRANSCRIPT, handler);

send(data)

Scribeにオーディオデータを送信します(手動オーディオモードのみ)。

connection.send({
audioBase64: base64AudioChunk,
commit: false, // Optional: commit immediately
sampleRate: 16000, // Optional: override sample rate
previousText: "Previous transcription text", // Optional: context from a previous transcription
});

previousTextフィールドを送信できるのは、セッションの最初のオーディオチャンクのみです。以降の チャンクで送信するとエラーになります。

commit()

現在の文字起こしを手動でコミットします。CommitStrategy.MANUALを使用する場合にのみ必要です。

connection.commit();

close()

WebSocket接続を閉じ、リソース(マイクストリーム、オーディオコンテキスト)をクリーンアップします。

connection.close();

イベント

connection.on(event, listener)を使用してイベントリスナーを登録します。すべてのイベントはRealtimeEvents列挙型の定数として利用できます。

文字起こしイベント

イベントデータ説明
SESSION_STARTED{ session_id: string }Scribeセッションが開始されました。
PARTIAL_TRANSCRIPT{ text: string }途中の文字起こし結果。
COMMITTED_TRANSCRIPT{ text: string }確定した文字起こし結果。
COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS{ text: string; language_code?: string; words?: WordsItem[] }単語レベルのタイミングを含む確定結果。

WordsItem型には、単語レベルのタイミング情報が含まれます。

interface WordsItem {
text?: string; // Word text
start?: number; // Start time in seconds
end?: number; // End time in seconds
type?: "word" | "spacing"; // Token type
speaker_id?: string; // Speaker identifier
}

接続イベント

イベントデータ説明
OPENEventWebSocket接続が開かれました。
CLOSEEventWebSocket接続が閉じられました。
ERRORError | Event一般的なエラー。

エラーイベント

すべてのエラーイベントは{ error: string }を受け取ります。

イベント説明
AUTH_ERROR認証エラー。
QUOTA_EXCEEDED使用量クォータを超過しました。
COMMIT_THROTTLEDコミットリクエストがスロットリングされました。
TRANSCRIBER_ERROR文字起こしエンジンのエラー。
UNACCEPTED_TERMS利用規約が承認されていません。
RATE_LIMITEDレート制限に達しました。
INPUT_ERROR無効な入力形式。
QUEUE_OVERFLOW処理キューが満杯です。
RESOURCE_EXHAUSTEDサーバーリソースが上限に達しています。
SESSION_TIME_LIMIT_EXCEEDED最大セッション時間に達しました。
CHUNK_SIZE_EXCEEDEDオーディオチャンクが大きすぎます。
INSUFFICIENT_AUDIO_ACTIVITY接続を維持するためのオーディオアクティビティが不足しています。

コミット戦略

文字起こしをコミットするタイミングを制御します。

import { Scribe, CommitStrategy } from '@elevenlabs/client';
// Manual (default): you control when to commit
const connection = Scribe.connect({
token,
modelId: 'scribe_v2_realtime',
audioFormat: AudioFormat.PCM_16000,
sampleRate: 16000,
commitStrategy: CommitStrategy.MANUAL,
});
// Send audio, then commit when ready
connection.send({ audioBase64: chunk });
connection.commit();
// Voice Activity Detection: Scribe detects silences and commits automatically
const connection = Scribe.connect({
token,
modelId: 'scribe_v2_realtime',
microphone: { echoCancellation: true },
commitStrategy: CommitStrategy.VAD,
});

詳細については、文字起こしとコミット戦略を参照してください。

完全な例

VADベースのコミット戦略でマイクオーディオを書き起こす完全な例を示します。

import { Scribe, RealtimeEvents, CommitStrategy } from "@elevenlabs/client";
async function startTranscription() {
const token = await fetchToken();
const connection = Scribe.connect({
token,
modelId: "scribe_v2_realtime",
commitStrategy: CommitStrategy.VAD,
microphone: {
echoCancellation: true,
noiseSuppression: true,
},
});
connection.on(RealtimeEvents.SESSION_STARTED, (data) => {
console.log("Session started:", data.session_id);
});
connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
document.getElementById("live").textContent = data.text;
});
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
const el = document.createElement("p");
el.textContent = data.text;
document.getElementById("transcripts").appendChild(el);
document.getElementById("live").textContent = "";
});
connection.on(RealtimeEvents.ERROR, (error) => {
console.error("Scribe error:", error);
});
// Stop button
document.getElementById("stop").addEventListener("click", () => {
connection.close();
});
}
document.getElementById("start").addEventListener("click", startTranscription);