mcpField
S
speech-to-text

speech-to-text

github.com/elevenlabs创意与媒体51612.2k 次安装今天更新
代码仓库

关于 speech-to-text

speech-to-text 是 ElevenLabs Scribe v2 的转录技能,供需要将音频或视频转换为文本的开发者使用。它提供批量与实时转录,并支持说话人识别、时间戳和多声道处理。

主要功能

  1. 01批量与实时转录
  2. 02支持 90 多种语言
  3. 03说话人区分与识别
  4. 04词级时间戳
  5. 05多声道转录与合并
  6. 06关键词提示

适用场景

  1. 01为长音频生成文字稿或字幕
  2. 02转录会议或访谈并区分说话人
  3. 03实时显示麦克风语音内容

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/elevenlabs/skills --skill speech-to-text

安装后在 Claude Code 中输入/speech-to-text确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
installation.md
realtime-client-side.md
realtime-commit-strategies.md
realtime-events.md
realtime-server-side.md
transcription-options.md

详细介绍

ElevenLabs 语音转文本

使用 Scribe v2 将音频转录为文本——支持 90 多种语言、说话人分离和词级时间戳。

**开始编写代码前先完成设置:**如果此项目尚未设置 ELEVENLABS_API_KEY,请先在应用文件夹中运行 npx -y @elevenlabs/cli@latest onboard init,并按照输出的说明操作:它会为用户登录并为项目存储密钥,因此无需手动复制密钥。否则,请参阅安装指南。对于 JavaScript,请仅使用 @elevenlabs/* 软件包。

快速开始

Python
from elevenlabs import ElevenLabs

client = ElevenLabs()

with open("audio.mp3", "rb") as audio_file:
    result = client.speech_to_text.convert(file=audio_file, model_id="scribe_v2")

print(result.text)
JavaScript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { createReadStream } from "fs";

const client = new ElevenLabsClient();
const result = await client.speechToText.convert({
  file: createReadStream("audio.mp3"),
  modelId: "scribe_v2",
});
console.log(result.text);
CLI
elevenlabs speech-to-text convert --file audio.mp3 --model-id scribe_v2

模型

模型 ID描述最适用于
scribe_v2最先进的准确度,支持 90 多种语言批量转录、字幕、长音频
scribe_v2_medical专门识别医疗和临床音频,支持 90 多种语言临床文档、医疗听写、患者通话
scribe_v2_realtime低延迟(约 150 毫秒)实时转录、语音 Agent
scribe_v2_realtime_turbo实时转录变体实时转录
scribe_v2_realtime_lite实时转录变体实时转录

带时间戳的转录

词级时间戳包含类型分类和说话人识别:

result = client.speech_to_text.convert(
    file=audio_file, model_id="scribe_v2", timestamps_granularity="word"
)

for word in result.words:
    print(f"{word.text}: {word.start}s - {word.end}s (type: {word.type})")

说话人分离

识别谁说了什么——模型会为每个词标注说话人 ID,适用于会议、访谈或任何多人音频:

result = client.speech_to_text.convert(
    file=audio_file,
    model_id="scribe_v2",
    diarize=True
)

for word in result.words:
    print(f"[{word.speaker_id}] {word.text}")

对于通话录音,可在设置 diarize=true 的同时设置 detect_speaker_roles=true,让批量 API 将分离出的说话人标记为 agent 和 customer。此选项与 use_multi_channel=true 不兼容。

如果您的工作区已注册说话人档案,请在设置 diarize=true 的同时设置 use_speaker_library=true,将检测到的说话人与说话人库进行匹配。

elevenlabs speech-to-text convert \
  --file call.mp3 \
  --model-id scribe_v2 \
  --diarize true \
  --detect-speaker-roles true \
  --use-speaker-library true

多声道音频

当每位说话人的音频单独位于一个声道时,请使用 use_multi_channel=true。默认情况下,API 会在 transcripts 下为每个声道返回一份转录;设置 multichannel_output_style="combined" 可接收按时间戳合并的一份转录,其中每个词都带有 channel_index。

result = client.speech_to_text.convert(
    file=audio_file,
    model_id="scribe_v2",
    use_multi_channel=True,
    multichannel_output_style="combined",
)

关键术语提示

帮助模型识别它可能会误听的特定词语——产品名称、技术术语或特殊拼写(最多 100 个):

result = client.speech_to_text.convert(
    file=audio_file,
    model_id="scribe_v2",
    keyterms=["ElevenLabs", "Scribe", "API"]
)

语言检测

自动检测,可选提供语言提示:

result = client.speech_to_text.convert(
    file=audio_file,
    model_id="scribe_v2",
    language_code="eng"  # ISO 639-1 or ISO 639-3 code
)

print(f"Detected: {result.language_code} ({result.language_probability:.0%})")

支持的格式

**音频:**MP3、WAV、M4A、FLAC、OGG、WebM、AAC、AIFF、Opus
**视频:**MP4、AVI、MKV、MOV、WMV、FLV、WebM、MPEG、3GPP

**限制:**文件大小最多 5.0GB,时长最多 10 小时

响应格式

{
  "text": "The full transcription text",
  "language_code": "eng",
  "language_probability": 0.98,
  "words": [
    {"text": "The", "start": 0.0, "end": 0.15, "type": "word", "speaker_id": "speaker_0"},
    {"text": " ", "start": 0.15, "end": 0.16, "type": "spacing", "speaker_id": "speaker_0"}
  ]
}

词语类型:

  • word - 实际说出的词语
  • spacing - 词语之间的空白(有助于精确计时)
  • audio_event - 模型检测到的非语音声音(笑声、掌声、音乐等)

错误处理

try:
    result = client.speech_to_text.convert(file=audio_file, model_id="scribe_v2")
except Exception as e:
    print(f"Transcription failed: {e}")

常见错误:

  • 401:API 密钥无效
  • 422:参数无效
  • 429:超出速率限制

跟踪成本

通过 request-id 响应头监控用量:

response = client.speech_to_text.with_raw_response.convert(file=audio_file, model_id="scribe_v2")
result = response.data
print(f"Request ID: {response.headers.get('request-id')}")

实时流式处理

如需以超低延迟(约 150 毫秒)进行实时转录,请使用实时 API。实时 API 会生成两种转录结果:

  • **部分转录:**音频处理过程中频繁更新的临时结果——用于提供实时反馈(例如,在用户说话时显示文本)
  • 已提交转录:“提交”后生成的最终稳定结果——将其作为应用的可信数据来源

“提交”会告诉模型完成当前片段。您可以手动提交(例如,用户停顿时),也可以使用语音活动检测(VAD)在静音时自动提交。

Python(服务端)
import asyncio
from elevenlabs import CommitStrategy, ElevenLabs, RealtimeEvents, RealtimeUrlOptions

client = ElevenLabs()

async def transcribe_realtime():
    done = asyncio.Event()
    connection = await client.speech_to_text.realtime.connect(RealtimeUrlOptions(
        model_id="scribe_v2_realtime",
        url="https://npr-ice.streamguys1.com/live.mp3",
        commit_strategy=CommitStrategy.VAD,  # URL streams never commit on their own
        include_timestamps=True,
        keyterms=["ElevenLabs", "Scribe"],
        no_verbatim=True,
    ))

    def on_error(error):
        print(f"Error: {error}")
        done.set()

    connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, lambda data: print(f"Partial: {data.get('text', '')}"))
    connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, lambda data: print(f"Final: {data.get('text', '')}"))
    connection.on(RealtimeEvents.ERROR, on_error)
    connection.on(RealtimeEvents.CLOSE, done.set)

    try:
        await done.wait()
    finally:
        await connection.close()

asyncio.run(transcribe_realtime())
JavaScript(使用 React 的客户端)
import { useScribe, CommitStrategy } from "@elevenlabs/react";

function TranscriptionComponent() {
  const [transcript, setTranscript] = useState("");

  const scribe = useScribe({
    modelId: "scribe_v2_realtime",
    commitStrategy: CommitStrategy.VAD, // Auto-commit on silence for mic input
    keyterms: ["ElevenLabs", "Scribe"],
    noVerbatim: true,
    includeLanguageDetection: true,
    onPartialTranscript: (data) => console.log("Partial:", data.text),
    onCommittedTranscript: (data) => setTranscript((prev) => prev + data.text),
  });

  const start = async () => {
    // Get token from your backend (never expose API key to client)
    const { token } = await fetch("/scribe-token").then((r) => r.json());

    await scribe.connect({
      token,
      microphone: { echoCancellation: true, noiseSuppression: true },
    });
  };

  return <button onClick={start}>Start Recording</button>;
}
提交策略
策略描述
Manual准备就绪时调用 commit()——适用于文件处理,或由你控制音频片段的情况
VAD检测到静音时,语音活动检测会自动提交——适用于实时麦克风输入

设置 includeLanguageDetection: true,即可在延迟的最终转录事件中接收检测到的语言代码。

// React: set commitStrategy on the hook (recommended for mic input)
import { useScribe, CommitStrategy } from "@elevenlabs/react";

const scribe = useScribe({
  modelId: "scribe_v2_realtime",
  commitStrategy: CommitStrategy.VAD,
  keyterms: ["ElevenLabs", "Scribe"],
  noVerbatim: true,
  // Optional VAD tuning:
  vadSilenceThresholdSecs: 1.5,
  vadThreshold: 0.4,
});
// JavaScript client: pass vad config on connect
const connection = await client.speechToText.realtime.connect({
  modelId: "scribe_v2_realtime",
  keyterms: ["ElevenLabs", "Scribe"],
  noVerbatim: true,
  vad: {
    silenceThresholdSecs: 1.5,
    threshold: 0.4,
  },
});
事件类型
事件描述
partial_transcript实时中间结果
final_transcript在片段提交前发送的稳定片段结果
final_transcript_with_timestamps带时间戳和/或检测到的语言的延迟最终结果
committed_transcript提交后的最终结果
committed_transcript_with_timestamps带词语时间信息的最终结果
committed_transcript_entities在已提交片段中检测到的实体
edited_transcript启用转录编辑时,已提交片段的原始文本和编辑后文本
invalid_request连接参数被拒绝,会话随之关闭
error发生错误

请参阅实时参考文档,了解完整说明。

参考

评论

支持 Markdown