> Discover all available pages from the documentation index: https://mastra.zisheng.pro/llms.txt # CompositeVoice CompositeVoice 类允许组合不同的语音 Provider 来执行文本转语音和语音转文本操作。当你希望为每种操作使用最合适的 Provider 时,这尤其有用——例如,使用 OpenAI 进行语音转文本,使用 PlayAI 进行文本转语音。 CompositeVoice 同时支持 Mastra 语音 Provider 和 AI SDK 模型 Provider。 ## 构造函数参数 **config** (`object`): 复合语音服务的配置对象 **config.input** (`MastraVoice | TranscriptionModel`): 用于语音转文本操作的语音 Provider 或 AI SDK 转录模型。AI SDK 模型会自动封装。 **config.output** (`MastraVoice | SpeechModel`): 用于文本转语音操作的语音 Provider 或 AI SDK 语音模型。AI SDK 模型会自动封装。 **config.realtime** (`MastraVoice`): 用于实时语音到语音操作的语音 Provider ## 方法 ### `speak()` 使用已配置的语音输出 Provider 将文本转换为语音。 **input** (`string | NodeJS.ReadableStream`): 要转换为语音的文本 **options** (`object`): 传递给语音输出 Provider 的 Provider 专属选项 注意事项: - 如果未配置语音输出 Provider,此方法将抛出错误 - 选项会原样传递给已配置的语音输出 Provider - 返回音频数据 stream ### `listen()` 使用已配置的语音输入 Provider 将语音转换为文本。 **audioStream** (`NodeJS.ReadableStream`): 要转换为文本的音频 stream **options** (`object`): 传递给语音输入 Provider 的 Provider 专属选项 注意事项: - 如果未配置语音输入 Provider,此方法将抛出错误 - 选项会原样传递给已配置的语音输入 Provider - 根据 Provider 的不同,返回字符串或转录文本 stream ### `getSpeakers()` 返回语音输出 Provider 的可用语音列表,其中每个节点包含: **voiceId** (`string`): 语音的唯一标识符 **key** (`value`): 因 Provider 而异的其他语音属性(例如名称、语言) 注意事项: - 仅返回语音输出 Provider 的语音 - 如果未配置语音输出 Provider,则返回空数组 - 每个语音对象至少包含一个 voiceId 属性 - 其他语音属性取决于语音输出 Provider ## 用法示例 ### 使用 Mastra Voice Provider ```typescript import { CompositeVoice } from '@mastra/core/voice' import { OpenAIVoice } from '@mastra/voice-openai' import { PlayAIVoice } from '@mastra/voice-playai' // Create voice providers const openai = new OpenAIVoice() const playai = new PlayAIVoice() // Use OpenAI for listening (speech-to-text) and PlayAI for speaking (text-to-speech) const voice = new CompositeVoice({ input: openai, output: playai, }) // Convert speech to text using OpenAI const text = await voice.listen(audioStream) // Convert text to speech using PlayAI const audio = await voice.speak('Hello, world!') ``` ### 使用 AI SDK 模型 Provider 你可以将 AI SDK 转录模型和语音模型直接传递给 CompositeVoice: ```typescript import { CompositeVoice } from '@mastra/core/voice' import { openai } from '@ai-sdk/openai' import { elevenlabs } from '@ai-sdk/elevenlabs' // Use AI SDK models directly - they will be auto-wrapped const voice = new CompositeVoice({ input: openai.transcription('whisper-1'), // AI SDK transcription output: elevenlabs.speech('eleven_turbo_v2'), // AI SDK speech }) // Works the same way as with Mastra providers const text = await voice.listen(audioStream) const audio = await voice.speak('Hello from AI SDK!') ``` ### 混合搭配 你可以组合使用 Mastra Provider 和 AI SDK 模型: ```typescript import { CompositeVoice } from '@mastra/core/voice' import { PlayAIVoice } from '@mastra/voice-playai' import { groq } from '@ai-sdk/groq' const voice = new CompositeVoice({ input: groq.transcription('whisper-large-v3'), // AI SDK for STT output: new PlayAIVoice(), // Mastra for TTS }) ```