音轉(zhuǎn)寫(xiě)(Dictation)AI Provider 插件完整指南)
后端前端企業(yè)應(yīng)用MCP 服務(wù)【免費(fèi)下載鏈接】ever-gauzyEver? Gauzy? - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co項(xiàng)目地址https://gitcode.com/GitHub_Trending/ev/ever-gauzy點(diǎn)擊查看免費(fèi)下載Ever Gauzy 的 AI 聊天引擎gauzy/plugin-ai-chat通過(guò)插件化的 Provider 注冊(cè)機(jī)制接入多家語(yǔ)音與聊天模型廠(chǎng)商。gauzy/plugin-ai-provider-elevenlabs正是其中專(zhuān)門(mén)負(fù)責(zé)ElevenLabs Scribe 語(yǔ)音轉(zhuǎn)寫(xiě)speech-to-text的 Provider 插件它在應(yīng)用啟動(dòng)時(shí)把elevenlabs注冊(cè)進(jìn)AiProviderRegistry為 AI 聊天的語(yǔ)音輸入dictation功能提供音頻轉(zhuǎn)錄能力。讀完本文你將掌握該插件的定位、兩個(gè)環(huán)境變量的含義、Scribe 語(yǔ)音模型的選擇方式、BYOK自帶密鑰與全局環(huán)境變量的優(yōu)先級(jí)關(guān)系以及底層transcribeMultipart請(qǐng)求是如何被構(gòu)造與安全加固的。插件定位只做語(yǔ)音轉(zhuǎn)寫(xiě)不參與聊天與 Anthropic、OpenAI 等既做聊天又做語(yǔ)音的 Provider 不同ElevenLabs 插件是一個(gè)voice-only僅語(yǔ)音的 Provider它在啟動(dòng)時(shí)向聊天引擎的AiProviderRegistry注冊(cè)elevenlabschatCapable: false即永遠(yuǎn)不能被選為聊天模型它可以被租戶(hù)設(shè)為默認(rèn)語(yǔ)音 Providerdictation 轉(zhuǎn)寫(xiě)通道但模型選擇器里不會(huì)出現(xiàn)它的聊天選項(xiàng)。這一設(shè)計(jì)在 Provider 定義里體現(xiàn)得非常直白。查看 ai-provider-elevenlabs.provider.ts 可以看到models為空數(shù)組、defaultModel為空字符串而createModel()被實(shí)現(xiàn)為一個(gè)永遠(yuǎn)拋錯(cuò)的占位方法提示語(yǔ)為 ElevenLabs is a speech-to-text provider and cannot serve chat — select another provider for chat.。也就是說(shuō)即使某個(gè)租戶(hù)保存了 ElevenLabs 的密鑰聊天引擎也不會(huì)把它當(dāng)作可用的聊天模型。插件如何被裝載BaseAiProviderPlugin 生命周期插件的實(shí)現(xiàn)非常精簡(jiǎn)整個(gè)類(lèi)只有一行有效邏輯。查看 ai-provider-elevenlabs.plugin.tsPlugin({}) export class AiProviderElevenLabsPlugin extends BaseAiProviderPlugin { protected readonly definition elevenLabsProviderDefinition; }它繼承自gauzy/plugin-ai-chat的抽象基類(lèi) base-ai-provider.plugin.ts。基類(lèi)實(shí)現(xiàn)了兩個(gè)生命周期鉤子onPluginBootstrap()調(diào)用AiProviderRegistry.register(this.definition)把 Provider 定義注冊(cè)進(jìn)進(jìn)程級(jí)注冊(cè)表并打印綠色日志onPluginDestroy()調(diào)用AiProviderRegistry.unregister(this.definition.id)在插件卸載時(shí)移除注冊(cè)。AiProviderRegistry見(jiàn) provider-registry.ts是一個(gè)靜態(tài) Map 實(shí)現(xiàn)的注冊(cè)表刻意不依賴(lài) NestJS 依賴(lài)注入這樣 Provider 插件無(wú)需引入聊天模塊的 Nest 依賴(lài)圖聊天引擎在請(qǐng)求時(shí)再?gòu)倪@個(gè)注冊(cè)表讀取 Provider 定義并按order字段排序ElevenLabs 的order為120。該插件的公共 API 表面index.ts只導(dǎo)出插件類(lèi)和 Provider 定義兩個(gè)符號(hào)。環(huán)境變量配置ElevenLabs 插件讀取兩個(gè)環(huán)境變量變量說(shuō)明ELEVENLABS_API_KEY服務(wù)器級(jí)server-wideElevenLabs API 密鑰在 ElevenLabs 官方的 App Settings → API Keys 頁(yè)面創(chuàng)建。ELEVENLABS_BASE_URL可選的自定義 API 基礎(chǔ)地址默認(rèn)值為https://api.elevenlabs.io/v1。這兩者在 Provider 定義中分別對(duì)應(yīng)apiKeyEnvVars: [ELEVENLABS_API_KEY]和baseUrlEnvVar: ELEVENLABS_BASE_URL且defaultBaseUrl明確寫(xiě)為https://api.elevenlabs.io/v1。依據(jù) provider.types.ts 的契約apiKeyEnvVars是一個(gè)數(shù)組憑證解析時(shí)按順序檢查、第一個(gè)非空值生效baseUrlEnvVar提供自定義基礎(chǔ)地址的入口適合通過(guò)代理或私有網(wǎng)關(guān)轉(zhuǎn)發(fā) ElevenLabs 請(qǐng)求的部署這兩個(gè)變量都屬于environment來(lái)源僅在租戶(hù)未配置自己的 BYOK 密鑰時(shí)作為兜底。Speech-to-text 模型ElevenLabs Scribe插件內(nèi)置了兩款 Scribe 語(yǔ)音轉(zhuǎn)寫(xiě)模型定義見(jiàn) ai-provider-elevenlabs.provider.tsIdLabel界面顯示名scribe_v1默認(rèn)Scribe v1scribe_v1_experimentalScribe v1 (experimental)選擇方式進(jìn)入Settings → AI Providers → ElevenLabs → Speech model為當(dāng)前租戶(hù)挑選模型同時(shí)勾選Use as default voice provider即可把 ElevenLabs 設(shè)為該租戶(hù)的 dictation 轉(zhuǎn)寫(xiě) Provider。未選擇時(shí)代碼回退到DEFAULT_SPEECH_MODEL scribe_v1見(jiàn) ai-provider-elevenlabs.provider.ts。這套語(yǔ)音模型目錄在聊天引擎的類(lèi)型契約里對(duì)應(yīng)IAiSpeechCataloguespeech.models是租戶(hù)可選的轉(zhuǎn)寫(xiě)模型列表speech.defaultModel是未選擇時(shí)的默認(rèn)模型見(jiàn) provider.types.ts。轉(zhuǎn)寫(xiě)調(diào)用時(shí)聊天引擎會(huì)優(yōu)先使用租戶(hù)憑證行里保存的speechModel取不到再回退到 Provider 自身的speech.defaultModel。底層轉(zhuǎn)寫(xiě)請(qǐng)求POST /v1/speech-to-text插件實(shí)現(xiàn)的轉(zhuǎn)寫(xiě)函數(shù)transcribeAudio見(jiàn) ai-provider-elevenlabs.provider.ts會(huì)構(gòu)造一次 multipart 請(qǐng)求請(qǐng)求地址{baseUrl}/speech-to-textbaseUrl優(yōu)先取憑證里的自定義地址否則回退ELEVENLABS_BASE_URL或默認(rèn)值并經(jīng)過(guò)trimTrailingSlash去除尾部斜杠方法POSTmultipart 表單包含file音頻文件、model_id注意是model_id而非model這是 ElevenLabs API 與 OpenAI 系/audio/transcriptions的關(guān)鍵差異、可選的language_code認(rèn)證請(qǐng)求頭攜帶xi-api-keyElevenLabs 專(zhuān)用請(qǐng)求頭而非Authorization: Bearer返回從響應(yīng) JSON 的text字段讀取轉(zhuǎn)寫(xiě)文本。language_code只在調(diào)用方提供了語(yǔ)言提示時(shí)才發(fā)送格式為 ISO-639-1 如en或 BCP-47 標(biāo)簽未提供時(shí)由 ElevenLabs 自動(dòng)檢測(cè)。共享的 multipart 轉(zhuǎn)寫(xiě)管道transcribeAudio復(fù)用了gauzy/plugin-ai-chat提供的共享函數(shù)transcribeMultipart見(jiàn) openai-compatible-transcribe.ts。這個(gè)共享管道為所有語(yǔ)音 Provider 統(tǒng)一實(shí)現(xiàn)了音頻擴(kuò)展名推導(dǎo)根據(jù)瀏覽器MediaRecorder記錄的 MIME 類(lèi)型如audio/webm;codecsopus、audio/mp4推導(dǎo) multipart 文件名后綴resolveAudioExtension因?yàn)?ElevenLabs 等上游服務(wù)依賴(lài)擴(kuò)展名判斷容器格式字段過(guò)濾值為undefined或空字符串的 multipart 字段不會(huì)被發(fā)送language_code未提供時(shí)即被跳過(guò)超時(shí)控制TRANSCRIBE_TIMEOUT_MS 60_000一分鐘語(yǔ)音轉(zhuǎn)寫(xiě)允許更長(zhǎng)的處理時(shí)間見(jiàn) openai-compatible-transcribe.tsSSRF 防護(hù)請(qǐng)求經(jīng)由ssrfSafeFetch出站守衛(wèi)循環(huán)/私網(wǎng)/鏈路本地目標(biāo)默認(rèn)被拒絕、DNS 解析后重新校驗(yàn)主機(jī)、不跟隨重定向見(jiàn) openai-compatible-transcribe.ts。只有當(dāng)憑證顯式允許私有端點(diǎn)isPrivateAiProviderEndpointAllowed(credentials)時(shí)才放行錯(cuò)誤分類(lèi)按狀態(tài)碼區(qū)分失敗類(lèi)型——401/403為key-rejected密鑰被拒429為rate-limited限流400/415/422為audio-rejected音頻被拒/格式不支持其余為通用http錯(cuò)誤見(jiàn) openai-compatible-transcribe.ts密鑰脫敏與響應(yīng)上限錯(cuò)誤信息中的密鑰會(huì)被redactSecret替換錯(cuò)誤體最多讀取 2048 字節(jié)成功響應(yīng)最多緩沖 4 MiB、轉(zhuǎn)寫(xiě)文本最多中繼 64 KiBMAX_TRANSCRIPT_CHARS。BYOKbring your own key租戶(hù)密鑰優(yōu)先插件支持 BYOK 模式。租戶(hù)通過(guò) AI 聊天憑證 API/api/ai-chat/credentials為elevenlabsProvider 保存的憑證總是優(yōu)先于ELEVENLABS_*環(huán)境變量環(huán)境變量只在租戶(hù)未配置任何憑證時(shí)作為服務(wù)器級(jí)兜底。這一優(yōu)先級(jí)在憑證模型中由source字段承載見(jiàn) provider.types.ts取值依次為tenant→environment→platform。租戶(hù)憑證行還額外攜帶兩個(gè)與語(yǔ)音相關(guān)的字段見(jiàn) ai-provider-credential.entity.ts 附近與 ai-provider-credential.service.tsspeechModel該租戶(hù)為這個(gè) Provider 選定的轉(zhuǎn)寫(xiě)模型isVoiceDefault是否將該 Provider 設(shè)為租戶(hù)默認(rèn)語(yǔ)音dictationProvider——保存時(shí)系統(tǒng)會(huì)調(diào)用clearOtherVoiceDefaults清除該租戶(hù)其他憑證上的此標(biāo)志保證同時(shí)最多一個(gè)默認(rèn)語(yǔ)音 Provider見(jiàn) ai-provider-credential.service.ts。Dictation 的完整執(zhí)行鏈路聊天引擎的transcribe服務(wù)見(jiàn) ai-chat.service.ts按以下順序處理一次語(yǔ)音轉(zhuǎn)寫(xiě)校驗(yàn)音頻非空、且不超過(guò)MAX_AUDIO_BYTES上限約 25 MB對(duì)應(yīng)上傳攔截器的 multer 限制從注冊(cè)表篩出所有實(shí)現(xiàn)了transcribe的 Providertypeof definition.transcribe function并按order排序一個(gè)都沒(méi)有則拋出 503NOT_CONFIGURED若租戶(hù)設(shè)置了默認(rèn)語(yǔ)音 ProviderresolveVoiceDefault讀取isVoiceDefault標(biāo)記默認(rèn)語(yǔ)音 Provider 排在最前優(yōu)先嘗試其余保持展示順序依次為每個(gè) Provider 解析憑證租戶(hù) BYOK → 環(huán)境變量、取出其speechModel或 Provider 默認(rèn)模型調(diào)用definition.transcribe(...)單個(gè) Provider 失敗不中斷整個(gè)請(qǐng)求會(huì)記錄失敗原因并繼續(xù)嘗試下一個(gè)可轉(zhuǎn)寫(xiě)的 Provider全部失敗才拋出 503錯(cuò)誤體為結(jié)構(gòu)化對(duì)象{ message, code, settingsPath }前端可據(jù)此渲染可操作的提示并鏈接到 AI Providers 設(shè)置頁(yè)。這種默認(rèn)語(yǔ)音 Provider 優(yōu)先、可轉(zhuǎn)寫(xiě) Provider 兜底的設(shè)計(jì)意味著即使租戶(hù)的聊天模型跑在 Anthropic本身無(wú)語(yǔ)音模型上只要同時(shí)配置了 ElevenLabs或 OpenAI、本地 whisper 服務(wù)器等任一可轉(zhuǎn)寫(xiě) Providerdictation 依然可用無(wú)需切換聊天 Provider。安裝與構(gòu)建該插件位于倉(cāng)庫(kù) packages/plugins/ai-provider-elevenlabs 目錄包名為gauzy/plugin-ai-provider-elevenlabs見(jiàn)其 package.json依賴(lài)gauzy/plugin-ai-chat、gauzy/plugin與gauzy/contracts要求 Node.js 22、Yarn 1.22。其構(gòu)建腳本為yarn nx build plugin-ai-provider-elevenlabs開(kāi)發(fā)時(shí)的監(jiān)聽(tīng)構(gòu)建可用lib:watch腳本yarn nx build plugin-ai-provider-elevenlabs --watch。安裝方式與 Ever Gauzy 其余插件一致在服務(wù)端應(yīng)用的插件列表apps/api/src/plugins.ts中加入AiProviderElevenLabsPlugin應(yīng)用啟動(dòng)時(shí)插件就會(huì)隨BaseAiProviderPlugin的 bootstrap 生命周期把elevenlabs注冊(cè)進(jìn)聊天引擎的 Provider 注冊(cè)表。小結(jié)gauzy/plugin-ai-provider-elevenlabs是 Ever Gauzy AI 聊天引擎語(yǔ)音能力的關(guān)鍵拼圖它把 ElevenLabs Scribe 封裝為 voice-only Provider通過(guò)ELEVENLABS_API_KEY/ELEVENLABS_BASE_URL兩個(gè)環(huán)境變量提供服務(wù)器級(jí)默認(rèn)配置通過(guò) Settings 頁(yè)為每個(gè)租戶(hù)選擇 Scribe 模型并可選設(shè)為默認(rèn)語(yǔ)音 Provider且始終讓租戶(hù)的 BYOK 憑證優(yōu)先于環(huán)境變量。底層則復(fù)用了gauzy/plugin-ai-chat的共享 multipart 轉(zhuǎn)寫(xiě)管道統(tǒng)一獲得超時(shí)控制、SSRF 出站防護(hù)、錯(cuò)誤分類(lèi)與密鑰脫敏從而在開(kāi)箱即用與安全可控之間取得平衡。贊分享后端前端企業(yè)應(yīng)用MCP 服務(wù)【免費(fèi)下載鏈接】ever-gauzyEver? Gauzy? - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co項(xiàng)目地址https://gitcode.com/GitHub_Trending/ev/ever-gauzy點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Ever Gauzy 接入 LocalAI本地化 AI Chat 與語(yǔ)音聽(tīng)寫(xiě) Provider 插件完全指南Ever Gauzy 接入 LocalAI本地化 AI Chat 與語(yǔ)音聽(tīng)寫(xiě) Provider 插件完全指南 Ever? Gauzy?開(kāi)源企業(yè)管理平臺(tái)內(nèi)置后端前端企業(yè)應(yīng)用MCP 服務(wù)Ever Gauzy 本地語(yǔ)音轉(zhuǎn)文字接入 whisper.cpp whisper-server 的完整指南Ever Gauzy 本地語(yǔ)音轉(zhuǎn)文字接入 whisper.cpp whisper server 的完整指南 導(dǎo)讀 本文圍繞 Ever Gauzy 開(kāi)源倉(cāng)庫(kù)中的后端前端企業(yè)應(yīng)用MCP 服務(wù)Ever Gauzy 接入 Grokai-provider-grok 插件配置與實(shí)現(xiàn)原理詳解Ever Gauzy 接入 Grokai provider grok 插件配置與實(shí)現(xiàn)原理詳解 本指南以 Ever? Gauzy? 開(kāi)源業(yè)務(wù)管理平臺(tái)中的 ga后端前端企業(yè)應(yīng)用MCP 服務(wù)上一篇HomeAssistant-Tapo-Control支持設(shè)備清單從攝像頭到門(mén)鈴的全面兼容列表下一篇ECC 工程規(guī)范實(shí)戰(zhàn)HarmonyOS / ArkTS 開(kāi)發(fā)模式完全指南狀態(tài)管理 V2、Navigation 路由、MVVM 與性能優(yōu)化創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考