跳到主要内容

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()
speak的直接链接

使用已配置的语音输出 Provider 将文本转换为语音。

input:

string | NodeJS.ReadableStream
要转换为语音的文本

options?:

object
传递给语音输出 Provider 的 Provider 专属选项

注意事项:

  • 如果未配置语音输出 Provider,此方法将抛出错误
  • 选项会原样传递给已配置的语音输出 Provider
  • 返回音频数据 stream

listen()
listen的直接链接

使用已配置的语音输入 Provider 将语音转换为文本。

audioStream:

NodeJS.ReadableStream
要转换为文本的音频 stream

options?:

object
传递给语音输入 Provider 的 Provider 专属选项

注意事项:

  • 如果未配置语音输入 Provider,此方法将抛出错误
  • 选项会原样传递给已配置的语音输入 Provider
  • 根据 Provider 的不同,返回字符串或转录文本 stream

getSpeakers()
getspeakers的直接链接

返回语音输出 Provider 的可用语音列表,其中每个节点包含:

voiceId:

string
语音的唯一标识符

key?:

value
因 Provider 而异的其他语音属性(例如名称、语言)

注意事项:

  • 仅返回语音输出 Provider 的语音
  • 如果未配置语音输出 Provider,则返回空数组
  • 每个语音对象至少包含一个 voiceId 属性
  • 其他语音属性取决于语音输出 Provider

用法示例
用法示例的直接链接

使用 Mastra Voice Provider
使用 Mastra Voice Provider的直接链接

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 模型 Provider的直接链接

你可以将 AI SDK 转录模型和语音模型直接传递给 CompositeVoice:

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 模型:

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
})