news 2026/9/11 21:21:26

Deepgram Provider for AI SDK(TypeScript):语音转写与文本转语音完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Deepgram Provider for AI SDK(TypeScript):语音转写与文本转语音完整指南

Deepgram Provider for AI SDK(TypeScript):语音转写与文本转语音完整指南

【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai

Deepgram 是 AI SDK(Vercel AI Toolkit for TypeScript)中专注于语音能力的官方 Provider,提供基于 Deepgram 云端 API 的**语音转写(Speech-to-Text / Transcription)文本转语音(Text-to-Speech)**两类模型支持。本文将以 packages/deepgram/README.md 为主线,结合 content/providers/01-ai-sdk-providers/110-deepgram.mdx 官方文档与packages/deepgram/src源码实现,系统讲解其安装、Provider 实例化、transcription 与 speech 的完整用法、全部 providerOptions 参数、模型能力对照,以及底层请求如何被组装与校验,帮助你直接在 AI SDK 应用中接入高质量语音能力。

部署到 Vercel?通过 Vercel AI Gateway 可以直接访问 Deepgram(以及数百个来自其他 Provider 的模型)——无需额外安装包、API Key 或额外成本。

安装与版本要求

Deepgram Provider 以独立 npm 包@ai-sdk/deepgram的形式发布,与 AI SDK 主包ai配合使用:

npm i @ai-sdk/deepgram

从 packages/deepgram/package.json 可以看到该包的工程约束:

  • 运行时依赖仅两个工作区包:@ai-sdk/provider@ai-sdk/provider-utils
  • 引擎要求node >= 22,采用 ESM 模块("type": "module"),导出路径为dist/index.js
  • 可通过./package.json子路径查看版本信息(当前仓库中版本为3.1.10,遵循 AI SDK v7 的 Provider V4 规范)。

使用编码 Agent(如 Claude Code、Cursor)的开发者,建议将 AI SDK skill 加入仓库以获取完整开发指引:

npx skills add vercel/ai

Provider 实例:默认实例与自定义配置

使用默认实例

@ai-sdk/deepgram直接导出一个开箱即用的默认实例deepgram

import { deepgram } from '@ai-sdk/deepgram';

默认实例内部通过createDeepgram()创建(见 deepgram-provider.ts),API Key 默认从环境变量DEEPGRAM_API_KEY读取。

自定义实例 createDeepgram

当需要定制行为(如自定义 fetch、附加请求头、显式传入 API Key)时,使用createDeepgram

import { createDeepgram } from '@ai-sdk/deepgram'; const deepgram = createDeepgram({ // 自定义设置,例如: fetch: customFetch, });

可选设置项(对应源码DeepgramProviderSettings,见 deepgram-provider.ts):

设置项类型说明
apiKeystring通过Authorization请求头发送。默认读取DEEPGRAM_API_KEY环境变量
headersRecord<string,string>附加到请求中的自定义请求头
fetch(input, init) => Promise<Response>自定义 fetch 实现,默认使用全局fetch。可用于拦截请求,或提供测试用的 mock 实现

从源码看,API Key 并非使用常见的Bearer前缀,而是拼装为Token ${apiKey}authorization头(见 deepgram-provider.ts),并自动追加ai-sdk/deepgram/${VERSION}的 User-Agent 后缀。所有请求统一发往https://api.deepgram.com,转写走/v1/listen,语音合成走/v1/speak

DeepgramProvider还实现了 AI SDK 的ProviderV4接口,但只提供transcriptionspeech两类能力;调用languageModelembeddingModelimageModel等未支持方法会抛出NoSuchModelError(例如提示 "Deepgram does not provide language models"),这是 Provider 接口的规范占位。

语音转写(Transcription)

基础用法

通过deepgram.transcription('<modelId>')创建转写模型,配合 AI SDK 的transcribe()函数使用。音频可以是 URL 或二进制数据(Buffer/Uint8Array):

import { deepgram } from '@ai-sdk/deepgram'; import { transcribe } from 'ai'; const { text } = await transcribe({ model: deepgram.transcription('nova-3'), audio: new URL( 'https://github.com/vercel/ai/raw/refs/heads/main/examples/ai-functions/data/galileo.mp3', ), });

返回结果中text为完整转写文本。从 deepgram-transcription-model.ts 的返回结构可以确认,transcribe()还支持更丰富的返回值:segments(带startSecond/endSecond的词级时间戳)、language(检测到的语言,需开启语言检测)、durationInSeconds(音频时长),以及完整的response原始信息。

开启语言自动检测

Deepgram 的detectLanguage开启后,会自动识别音频语言,返回结果中会附带language字段:

import { deepgram } from '@ai-sdk/deepgram'; import { transcribe } from 'ai'; const { text, language } = await transcribe({ model: deepgram.transcription('nova-3'), audio: new URL( 'https://github.com/vercel/ai/raw/refs/heads/main/examples/ai-functions/data/galileo.mp3', ), providerOptions: { deepgram: { detectLanguage: true, }, }, });

转写 providerOptions 完整参数表

以下选项通过providerOptions.deepgram传入,全部为可选,命名采用 camelCase,源码中会被映射为 Deepgram API 的 snake_case 查询参数(映射逻辑见 deepgram-transcription-model.ts,参数 Schema 定义见 deepgram-transcription-model-options.ts):

参数类型说明映射的上游参数
languagestring音频语言代码,支持多种 ISO-639-1 / ISO-639-3 代码;不指定时默认英语language
detectLanguageboolean是否启用自动语言检测detect_language
smartFormatboolean智能格式化(将数字、日期、时间等书面化)smart_format
punctuateboolean为转写文本添加标点punctuate
paragraphsboolean将转写文本格式化为段落paragraphs
summarize'v2' \| false是否生成转写摘要,'v2'为最新版本,false关闭summarize
topicsboolean是否识别转写内容主题topics
intentsboolean是否识别转写内容意图intents
sentimentboolean是否进行情感分析sentiment
detectEntitiesboolean是否检测并标记命名实体detect_entities
redactstring \| string[]从转写中脱敏的术语或模式(支持数组)redact
replacestring用于替换被脱敏内容的字符串replace
searchstring在转写中搜索的术语或短语search
keytermstring用于提升识别准确率的关键词keyterm
diarizeboolean是否识别不同说话人。默认false,注意 Deepgram 按分钟对说话人分离额外计费diarize
utterancesboolean是否将转写切分为语句段(utterances)utterances
uttSplitnumber触发新语句段的静音阈值(秒)utt_split
fillerWordsboolean是否在转写中保留填充词(um、uh 等)filler_words

例如开启摘要:

import { transcribe } from 'ai'; import { deepgram, type DeepgramTranscriptionModelOptions, } from '@ai-sdk/deepgram'; import { readFile } from 'fs/promises'; const result = await transcribe({ model: deepgram.transcription('nova-3'), audio: await readFile('audio.mp3'), providerOptions: { deepgram: { summarize: true, } satisfies DeepgramTranscriptionModelOptions, }, });

底层请求组装原理

转写模型的核心逻辑位于 deepgram-transcription-model.ts:

  1. 参数解析与校验parseProviderOptions用 zod schema 校验providerOptions.deepgram,非法值会在编译期/运行期被拦截;
  2. 参数映射:camelCase 选项逐一映射为 Deepgram API 的 snake_case 参数(如detectLanguagedetect_language),连同模型 ID 一起组装进请求体;
  3. Query 序列化URLSearchParams仅追加非undefined的字段;
  4. 请求发送:通过postToApihttps://api.deepgram.com/v1/listen?<query>发送音频(Content-Type使用options.mediaType),成功响应用 JSON handler 解析,失败响应由deepgramFailedResponseHandler处理;
  5. 响应提取:从results.channels[0].alternatives[0]中提取transcriptwords(词级起止时间),从metadata.duration提取音频时长,从detected_language提取检测语言。

Deepgram 的错误响应结构为{err_code, err_msg, request_id},失败处理时以err_msg作为错误消息抛出(见 deepgram-error.ts)。

文本转语音(Text-to-Speech)

基础用法

通过deepgram.speech('<familyId>')创建语音合成模型,配合 AI SDK 的generateSpeech()使用:

import { deepgram } from '@ai-sdk/deepgram'; import { generateSpeech } from 'ai'; const { audio } = await generateSpeech({ model: deepgram.speech('aura-2'), voice: 'helena', text: 'Hello, welcome to Deepgram!', });

语音家族与 voice/language 组合规则

speech()的第一个参数是语音家族 IDaura-2(当前代)或aura(Aura-1)。语音与语言通过generateSpeechvoicelanguage选项选择——Provider 会将其组合为上游 Deepgram 模型 ID:<family>-<voice>-<language>(语言默认en)。例如deepgram.speech('aura-2')+voice: 'thalia'+language: 'en'会解析为上游模型aura-2-thalia-en(组合逻辑见 deepgram-speech-model.ts)。

import { generateSpeech } from 'ai'; import { deepgram } from '@ai-sdk/deepgram'; const result = await generateSpeech({ model: deepgram.speech('aura-2'), voice: 'thalia', language: 'en', text: 'Hello, world!', });

注意:完整的语音模型 ID(例如deepgram.speech('aura-2-helena-en'))仍然可以直接透传使用,但官方推荐使用「家族 ID + voice/language」的形式,因为它与其他语音 Provider 的选音方式保持一致。若使用完整模型 ID 的同时又传入voicelanguage参数,Provider 会发出unsupported类型警告并忽略这些参数(因为声音已编码在模型 ID 中,见 deepgram-speech-model.ts)。

语音合成 providerOptions 完整参数表

通过providerOptions.deepgram传入,Schema 定义见 deepgram-speech-model-options.ts:

import { generateSpeech } from 'ai'; import { deepgram, type DeepgramSpeechModelOptions } from '@ai-sdk/deepgram'; const result = await generateSpeech({ model: deepgram.speech('aura-2'), voice: 'helena', text: 'Hello, world!', providerOptions: { deepgram: { encoding: 'linear16', sampleRate: 24000, } satisfies DeepgramSpeechModelOptions, }, });
参数类型说明
encodingstring输出音频编码。支持'linear16''mulaw''alaw''mp3''opus''flac''aac'。可选
containerstring输出音频容器格式。支持'wav''ogg''none'。可选
sampleRatenumber输出音频采样率(Hz)。可用值取决于编码:800016000240003200048000。可选
bitRatenumber \| string音频码率(bps)。mp33200048000opus4000650000aac4000192000。可选
callbackstringDeepgram 完成合成后回调请求的 URL(携带音频)。可选
callbackMethod'POST' \| 'PUT'回调请求的 HTTP 方法。可选
mipOptOutboolean是否选择退出 Deepgram 模型改进计划(Model Improvement Program)。可选
tagstring \| string[]为请求打标签,便于用量报告中识别。可选

输出格式、speed 与其他行为的底层处理

源码 deepgram-speech-model.ts 展示了generateSpeechoutputFormat(默认mp3)是如何被映射为 Deepgram 参数的:

outputFormatencodingcontainer说明
mp3mp3不设置固定 22050 采样率
wav/linear16linear16wav采样率可配
mulawmulawwav采样率 8000/16000
alawalawwav采样率 8000/16000
opus/oggopusogg固定 48000 采样率
flacflac不设置采样率可配
aacaac不设置固定 22050 采样率
pcmlinear16none裸音频

同时也支持"wav_44100""linear16_24000"这类「编码_采样率」组合格式的解析。

参数冲突校验:当providerOptionsoutputFormat推导出的参数冲突时,Provider 会做兼容性校验并产生unsupported类型警告(而非静默出错),例如:

  • linear16/mulaw/alaw只支持wavnone容器;
  • mp3/flac/aac不支持container参数;
  • mp3/opus/aac固定采样率,不支持sampleRate
  • linear16/mulaw/alaw/flac不支持bitRate

speed 选项generateSpeechspeed选项会原样透传为 Deepgram 的speed参数。Deepgram 仅接受 0.7–1.5 区间,超出范围会被上游以 400 错误拒绝;且并非所有语言都支持 speed。

instructions 选项:Deepgram REST API 不支持 instructions,传入时会被忽略并产生警告。

响应元数据generateSpeech的返回结果会将 Deepgram 响应头解析为providerMetadata.deepgram,包含:modelName(最终解析的上游模型)、modelUuidadditionalModelUuidscharCount(计费字符数)、breaksAppliedpronunciationsAppliedpronunciationWarnings(存在时)、requestId(见 deepgram-speech-model.ts)。

模型能力对照

语音家族与声音数(声音通过voice选项选择,完整声音名称与口音列表以 Deepgram TTS 模型文档为准):

家族可用声音
aura-241 个英语、17 个西班牙语、9 个荷兰语、7 个德语、10 个意大利语、5 个日语、2 个法语
aura12 个英语(Aura-1)

转写模型能力对照

deepgram.transcription()支持以下模型(可用 ID 全集见 deepgram-transcription-options.ts,各模型还带有-general-meeting-phonecall-medical-finance-voicemail-video-conversationalai-drivethru-automotive-atc等领域变体):

模型转写时长词级分段语言检测
nova-3(含变体)
nova-2(含变体)
nova(含变体)
enhanced(含变体)
base(含变体)

上表中「语言检测」列为 ✗ 表示该列对应的是模型自带能力维度,语言自动检测仍可通过detectLanguage: true的 providerOptions 开启(README 中的官方能力表即如此标注)。

测试与验证

该 Provider 的测试位于 packages/deepgram/src 目录:

  • deepgram-transcription-model.test.ts 与对应的 deepgram-transcription.json fixture:验证转写请求的查询参数组装与响应解析(含transcriptsegmentsdetected_language等字段);
  • deepgram-speech-model.test.ts:验证语音家族 ID 组合、outputFormat 映射与 providerOptions 冲突警告;
  • deepgram-error.test.ts:验证错误响应解析。

测试运行命令(见 package.json):

pnpm test:node # Node 环境测试 pnpm test:edge # Edge 环境测试

仓库根目录还提供了可直接运行的完整示例 examples/ai-functions,其中包含用于测试的音频样本(如galileo.mp3),可作为端到端参考。

小结

通过@ai-sdk/deepgram,你可以在 AI SDK 应用中用统一的transcribe()/generateSpeech()接口调用 Deepgram 的语音转写与文本转语音能力:转写侧支持语言检测、说话人分离、摘要、主题/意图/情感分析、实体检测、脱敏等丰富的智能后处理;合成侧支持aura-2/aura两大语音家族、7 种编码与多容器输出、回调与用量标签等。Provider 层在保持接口一致性的同时,对 Deepgram 上游参数做了完整映射、合法性校验与警告机制,源码(deepgram-provider.ts、deepgram-transcription-model.ts、deepgram-speech-model.ts)可作为进一步深入与排查问题的可靠依据。

【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 21:21:21

浏览器缓存机制与性能优化实践

1. 浏览器缓存机制全景解析 浏览器缓存作为Web性能优化的核心手段&#xff0c;其运作机制涉及多个层次的协同配合。现代浏览器通常采用四级缓存体系&#xff1a;Service Worker缓存、HTTP缓存、内存缓存&#xff08;Memory Cache&#xff09;和磁盘缓存&#xff08;Disk Cache&…

作者头像 李华
网站建设 2026/9/11 21:21:06

1m³/h袋式过滤器设计解析与工程实践

1. 项目概述&#xff1a;1m/h袋式过滤器图纸解析在工业流体处理领域&#xff0c;袋式过滤器作为预处理设备的核心部件&#xff0c;其设计合理性直接影响整个系统的运行效率。今天要拆解的这套1立方米每小时处理量的袋式过滤器图纸&#xff0c;是典型的低压小型过滤系统设计方案…

作者头像 李华
网站建设 2026/9/11 21:19:31

STM32工程化避坑指南:HAL库、硬件耦合与量产可靠性

1. 这不是“学得久就变强”的故事&#xff0c;而是“学得久才看清陷阱”的真相STM32学得越久&#xff0c;越容易掉进这三个坑——这句话不是危言耸听&#xff0c;是我带过67个嵌入式毕设学生、亲手调试过213块不同型号开发板、在工厂产线跟过4个月量产烧录流程后&#xff0c;用…

作者头像 李华
网站建设 2026/9/11 21:19:13

串口通信11

串口定义&#xff1a;是一种应用十分广泛的通讯接口&#xff0c;成本低操作简单&#xff0c;可实现两个设备的互相通信。51单片机内部自带UART&#xff0c;可实现单片机的串口通信。硬件电路&#xff1a;电平标准&#xff1a;差分信号是指两根线之间的电平差&#xff0c;TTL与R…

作者头像 李华