ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ever Gauzy 接入 ElevenLabs Scribe:语音转写(Dictation)AI Provider 插件完整指南

Ever Gauzy 接入 ElevenLabs Scribe:语音转写(Dictation)AI Provider 插件完整指南 后端前端企业应用MCP 服务【免费下载链接】ever-gauzyEver® Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co项目地址https://gitcode.com/GitHub_Trending/ev/ever-gauzy点击查看免费下载Ever Gauzy 的 AI 聊天引擎gauzy/plugin-ai-chat通过插件化的 Provider 注册机制接入多家语音与聊天模型厂商。gauzy/plugin-ai-provider-elevenlabs正是其中专门负责ElevenLabs Scribe 语音转写speech-to-text的 Provider 插件它在应用启动时把elevenlabs注册进AiProviderRegistry为 AI 聊天的语音输入dictation功能提供音频转录能力。读完本文你将掌握该插件的定位、两个环境变量的含义、Scribe 语音模型的选择方式、BYOK自带密钥与全局环境变量的优先级关系以及底层transcribeMultipart请求是如何被构造与安全加固的。插件定位只做语音转写不参与聊天与 Anthropic、OpenAI 等既做聊天又做语音的 Provider 不同ElevenLabs 插件是一个voice-only仅语音的 Provider它在启动时向聊天引擎的AiProviderRegistry注册elevenlabschatCapable: false即永远不能被选为聊天模型它可以被租户设为默认语音 Providerdictation 转写通道但模型选择器里不会出现它的聊天选项。这一设计在 Provider 定义里体现得非常直白。查看 ai-provider-elevenlabs.provider.ts 可以看到models为空数组、defaultModel为空字符串而createModel()被实现为一个永远抛错的占位方法提示语为 ElevenLabs is a speech-to-text provider and cannot serve chat — select another provider for chat.。也就是说即使某个租户保存了 ElevenLabs 的密钥聊天引擎也不会把它当作可用的聊天模型。插件如何被装载BaseAiProviderPlugin 生命周期插件的实现非常精简整个类只有一行有效逻辑。查看 ai-provider-elevenlabs.plugin.tsPlugin({}) export class AiProviderElevenLabsPlugin extends BaseAiProviderPlugin { protected readonly definition elevenLabsProviderDefinition; }它继承自gauzy/plugin-ai-chat的抽象基类 base-ai-provider.plugin.ts。基类实现了两个生命周期钩子onPluginBootstrap()调用AiProviderRegistry.register(this.definition)把 Provider 定义注册进进程级注册表并打印绿色日志onPluginDestroy()调用AiProviderRegistry.unregister(this.definition.id)在插件卸载时移除注册。AiProviderRegistry见 provider-registry.ts是一个静态 Map 实现的注册表刻意不依赖 NestJS 依赖注入这样 Provider 插件无需引入聊天模块的 Nest 依赖图聊天引擎在请求时再从这个注册表读取 Provider 定义并按order字段排序ElevenLabs 的order为120。该插件的公共 API 表面index.ts只导出插件类和 Provider 定义两个符号。环境变量配置ElevenLabs 插件读取两个环境变量变量说明ELEVENLABS_API_KEY服务器级server-wideElevenLabs API 密钥在 ElevenLabs 官方的 App Settings → API Keys 页面创建。ELEVENLABS_BASE_URL可选的自定义 API 基础地址默认值为https://api.elevenlabs.io/v1。这两者在 Provider 定义中分别对应apiKeyEnvVars: [ELEVENLABS_API_KEY]和baseUrlEnvVar: ELEVENLABS_BASE_URL且defaultBaseUrl明确写为https://api.elevenlabs.io/v1。依据 provider.types.ts 的契约apiKeyEnvVars是一个数组凭证解析时按顺序检查、第一个非空值生效baseUrlEnvVar提供自定义基础地址的入口适合通过代理或私有网关转发 ElevenLabs 请求的部署这两个变量都属于environment来源仅在租户未配置自己的 BYOK 密钥时作为兜底。Speech-to-text 模型ElevenLabs Scribe插件内置了两款 Scribe 语音转写模型定义见 ai-provider-elevenlabs.provider.tsIdLabel界面显示名scribe_v1默认Scribe v1scribe_v1_experimentalScribe v1 (experimental)选择方式进入Settings → AI Providers → ElevenLabs → Speech model为当前租户挑选模型同时勾选Use as default voice provider即可把 ElevenLabs 设为该租户的 dictation 转写 Provider。未选择时代码回退到DEFAULT_SPEECH_MODEL scribe_v1见 ai-provider-elevenlabs.provider.ts。这套语音模型目录在聊天引擎的类型契约里对应IAiSpeechCataloguespeech.models是租户可选的转写模型列表speech.defaultModel是未选择时的默认模型见 provider.types.ts。转写调用时聊天引擎会优先使用租户凭证行里保存的speechModel取不到再回退到 Provider 自身的speech.defaultModel。底层转写请求POST /v1/speech-to-text插件实现的转写函数transcribeAudio见 ai-provider-elevenlabs.provider.ts会构造一次 multipart 请求请求地址{baseUrl}/speech-to-textbaseUrl优先取凭证里的自定义地址否则回退ELEVENLABS_BASE_URL或默认值并经过trimTrailingSlash去除尾部斜杠方法POSTmultipart 表单包含file音频文件、model_id注意是model_id而非model这是 ElevenLabs API 与 OpenAI 系/audio/transcriptions的关键差异、可选的language_code认证请求头携带xi-api-keyElevenLabs 专用请求头而非Authorization: Bearer返回从响应 JSON 的text字段读取转写文本。language_code只在调用方提供了语言提示时才发送格式为 ISO-639-1 如en或 BCP-47 标签未提供时由 ElevenLabs 自动检测。共享的 multipart 转写管道transcribeAudio复用了gauzy/plugin-ai-chat提供的共享函数transcribeMultipart见 openai-compatible-transcribe.ts。这个共享管道为所有语音 Provider 统一实现了音频扩展名推导根据浏览器MediaRecorder记录的 MIME 类型如audio/webm;codecsopus、audio/mp4推导 multipart 文件名后缀resolveAudioExtension因为 ElevenLabs 等上游服务依赖扩展名判断容器格式字段过滤值为undefined或空字符串的 multipart 字段不会被发送language_code未提供时即被跳过超时控制TRANSCRIBE_TIMEOUT_MS 60_000一分钟语音转写允许更长的处理时间见 openai-compatible-transcribe.tsSSRF 防护请求经由ssrfSafeFetch出站守卫循环/私网/链路本地目标默认被拒绝、DNS 解析后重新校验主机、不跟随重定向见 openai-compatible-transcribe.ts。只有当凭证显式允许私有端点isPrivateAiProviderEndpointAllowed(credentials)时才放行错误分类按状态码区分失败类型——401/403为key-rejected密钥被拒429为rate-limited限流400/415/422为audio-rejected音频被拒/格式不支持其余为通用http错误见 openai-compatible-transcribe.ts密钥脱敏与响应上限错误信息中的密钥会被redactSecret替换错误体最多读取 2048 字节成功响应最多缓冲 4 MiB、转写文本最多中继 64 KiBMAX_TRANSCRIPT_CHARS。BYOKbring your own key租户密钥优先插件支持 BYOK 模式。租户通过 AI 聊天凭证 API/api/ai-chat/credentials为elevenlabsProvider 保存的凭证总是优先于ELEVENLABS_*环境变量环境变量只在租户未配置任何凭证时作为服务器级兜底。这一优先级在凭证模型中由source字段承载见 provider.types.ts取值依次为tenant→environment→platform。租户凭证行还额外携带两个与语音相关的字段见 ai-provider-credential.entity.ts 附近与 ai-provider-credential.service.tsspeechModel该租户为这个 Provider 选定的转写模型isVoiceDefault是否将该 Provider 设为租户默认语音dictationProvider——保存时系统会调用clearOtherVoiceDefaults清除该租户其他凭证上的此标志保证同时最多一个默认语音 Provider见 ai-provider-credential.service.ts。Dictation 的完整执行链路聊天引擎的transcribe服务见 ai-chat.service.ts按以下顺序处理一次语音转写校验音频非空、且不超过MAX_AUDIO_BYTES上限约 25 MB对应上传拦截器的 multer 限制从注册表筛出所有实现了transcribe的 Providertypeof definition.transcribe function并按order排序一个都没有则抛出 503NOT_CONFIGURED若租户设置了默认语音 ProviderresolveVoiceDefault读取isVoiceDefault标记默认语音 Provider 排在最前优先尝试其余保持展示顺序依次为每个 Provider 解析凭证租户 BYOK → 环境变量、取出其speechModel或 Provider 默认模型调用definition.transcribe(...)单个 Provider 失败不中断整个请求会记录失败原因并继续尝试下一个可转写的 Provider全部失败才抛出 503错误体为结构化对象{ message, code, settingsPath }前端可据此渲染可操作的提示并链接到 AI Providers 设置页。这种默认语音 Provider 优先、可转写 Provider 兜底的设计意味着即使租户的聊天模型跑在 Anthropic本身无语音模型上只要同时配置了 ElevenLabs或 OpenAI、本地 whisper 服务器等任一可转写 Providerdictation 依然可用无需切换聊天 Provider。安装与构建该插件位于仓库 packages/plugins/ai-provider-elevenlabs 目录包名为gauzy/plugin-ai-provider-elevenlabs见其 package.json依赖gauzy/plugin-ai-chat、gauzy/plugin与gauzy/contracts要求 Node.js 22、Yarn 1.22。其构建脚本为yarn nx build plugin-ai-provider-elevenlabs开发时的监听构建可用lib:watch脚本yarn nx build plugin-ai-provider-elevenlabs --watch。安装方式与 Ever Gauzy 其余插件一致在服务端应用的插件列表apps/api/src/plugins.ts中加入AiProviderElevenLabsPlugin应用启动时插件就会随BaseAiProviderPlugin的 bootstrap 生命周期把elevenlabs注册进聊天引擎的 Provider 注册表。小结gauzy/plugin-ai-provider-elevenlabs是 Ever Gauzy AI 聊天引擎语音能力的关键拼图它把 ElevenLabs Scribe 封装为 voice-only Provider通过ELEVENLABS_API_KEY/ELEVENLABS_BASE_URL两个环境变量提供服务器级默认配置通过 Settings 页为每个租户选择 Scribe 模型并可选设为默认语音 Provider且始终让租户的 BYOK 凭证优先于环境变量。底层则复用了gauzy/plugin-ai-chat的共享 multipart 转写管道统一获得超时控制、SSRF 出站防护、错误分类与密钥脱敏从而在开箱即用与安全可控之间取得平衡。赞分享后端前端企业应用MCP 服务【免费下载链接】ever-gauzyEver® Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co项目地址https://gitcode.com/GitHub_Trending/ev/ever-gauzy点击查看免费下载相关推荐Ever Gauzy 接入 LocalAI本地化 AI Chat 与语音听写 Provider 插件完全指南Ever Gauzy 接入 LocalAI本地化 AI Chat 与语音听写 Provider 插件完全指南 Ever® Gauzy™开源企业管理平台内置后端前端企业应用MCP 服务Ever Gauzy 本地语音转文字接入 whisper.cpp whisper-server 的完整指南Ever Gauzy 本地语音转文字接入 whisper.cpp whisper server 的完整指南 导读 本文围绕 Ever Gauzy 开源仓库中的后端前端企业应用MCP 服务Ever Gauzy 接入 Grokai-provider-grok 插件配置与实现原理详解Ever Gauzy 接入 Grokai provider grok 插件配置与实现原理详解 本指南以 Ever® Gauzy™ 开源业务管理平台中的 ga后端前端企业应用MCP 服务上一篇HomeAssistant-Tapo-Control支持设备清单从摄像头到门铃的全面兼容列表下一篇ECC 工程规范实战HarmonyOS / ArkTS 开发模式完全指南状态管理 V2、Navigation 路由、MVVM 与性能优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表