跳至主要內容

MastraVoice

MastraVoice 類別是一個抽象基底類別,定義 Mastra 語音服務的核心介面。所有語音 Provider 實作(例如 OpenAI、Deepgram、PlayAI、Speechify)都會擴充此類別,以提供各自的功能。此類別目前也支援透過 WebSocket 連線進行即時語音對語音互動。

使用範例
「使用範例」的直接連結

import { MastraVoice } from '@mastra/core/voice'

// Create a voice provider implementation
class MyVoiceProvider extends MastraVoice {
constructor(config: {
speechModel?: BuiltInModelConfig
listeningModel?: BuiltInModelConfig
speaker?: string
realtimeConfig?: {
model?: string
apiKey?: string
options?: unknown
}
}) {
super({
speechModel: config.speechModel,
listeningModel: config.listeningModel,
speaker: config.speaker,
realtimeConfig: config.realtimeConfig,
})
}

// Implement required abstract methods
async speak(
input: string | NodeJS.ReadableStream,
options?: { speaker?: string },
): Promise<NodeJS.ReadableStream | void> {
// Implement text-to-speech conversion
}

async listen(
audioStream: NodeJS.ReadableStream,
options?: unknown,
): Promise<string | NodeJS.ReadableStream | void> {
// Implement speech-to-text conversion
}

async getSpeakers(): Promise<Array<{ voiceId: string; [key: string]: unknown }>> {
// Return list of available voices
}

// Optional speech-to-speech methods
async connect(): Promise<void> {
// Establish WebSocket connection for speech-to-speech communication
}

async send(audioData: NodeJS.ReadableStream | Int16Array): Promise<void> {
// Stream audio data in speech-to-speech
}

async answer(): Promise<void> {
// Trigger voice provider to respond
}

addTools(tools: Array<unknown>): void {
// Add tools for the voice provider to use
}

close(): void {
// Close WebSocket connection
}

on(event: string, callback: (data: unknown) => void): void {
// Register event listener
}

off(event: string, callback: (data: unknown) => void): void {
// Remove event listener
}
}

建構函式參數
「建構函式參數」的直接連結

config?:

VoiceConfig
語音服務的設定物件

config.speechModel?:

BuiltInModelConfig
文字轉語音模型的設定
BuiltInModelConfig

name:

string
要使用的模型名稱

apiKey?:

string
模型服務的 API 金鑰

config.listeningModel?:

BuiltInModelConfig
語音轉文字模型的設定
BuiltInModelConfig

name:

string
要使用的模型名稱

apiKey?:

string
模型服務的 API 金鑰

config.speaker?:

string
要使用的預設說話者/語音 ID

config.name?:

string
語音 Provider 執行個體的名稱

config.realtimeConfig?:

object
即時語音對語音功能的設定
object

model?:

string
即時語音對語音功能要使用的模型

apiKey?:

string
即時服務的 API 金鑰

options?:

unknown
即時功能的 Provider 特定選項

抽象方法
「抽象方法」的直接連結

任何擴充 MastraVoice 的類別都必須實作這些方法。

speak()
「speak」的直接連結

使用已設定的語音模型將文字轉換成語音。

abstract speak(
input: string | NodeJS.ReadableStream,
options?: {
speaker?: string;
[key: string]: unknown;
}
): Promise<NodeJS.ReadableStream | void>

用途:

  • 接收文字輸入,並使用 Provider 的文字轉語音服務將其轉換成語音
  • 同時支援字串與串流輸入,使用方式更有彈性
  • 可透過選項覆寫預設的說話者/語音
  • 傳回可播放或儲存的音訊資料串流
  • 若音訊是透過發出 'speaking' 事件處理,則可能傳回 void

listen()
「listen」的直接連結

使用已設定的聆聽模型將語音轉換成文字。

abstract listen(
audioStream: NodeJS.ReadableStream,
options?: {
[key: string]: unknown;
}
): Promise<string | NodeJS.ReadableStream | void>

用途:

  • 接收音訊串流,並使用 Provider 的語音轉文字服務將其轉換成文字
  • 支援 Provider 特定選項以設定轉錄
  • 可傳回完整的轉錄文字或轉錄文字串流
  • 並非所有 Provider 都支援此功能(例如 PlayAI、Speechify)
  • 若轉錄是透過發出 'writing' 事件處理,則可能傳回 void

getSpeakers()
「getspeakers」的直接連結

傳回 Provider 支援的可用語音清單。

abstract getSpeakers(): Promise<Array<{ voiceId: string; [key: string]: unknown }>>

用途:

  • 從 Provider 取得可用的語音/說話者清單
  • 每個語音至少必須有一個 voiceId 屬性
  • Provider 可加入各語音的其他中繼資料
  • 用於尋找文字轉語音轉換可使用的語音

選用方法
「選用方法」的直接連結

這些方法具有預設實作,但支援語音對語音功能的語音 Provider 可以將其覆寫。

connect()
「connect」的直接連結

建立用於通訊的 WebSocket 或 WebRTC 連線。

connect(config?: unknown): Promise<void>

用途:

  • 初始化語音服務的通訊連線
  • 使用 send() 或 answer() 等功能前必須先呼叫
  • 傳回一個 Promise,並在連線建立後解析
  • 設定因 Provider 而異

send()
「send」的直接連結

將音訊資料即時串流至語音 Provider。

send(audioData: NodeJS.ReadableStream | Int16Array): Promise<void>

用途:

  • 將音訊資料傳送至語音 Provider 進行即時處理
  • 適合即時麥克風輸入等連續音訊串流情境
  • 同時支援 ReadableStream 和 Int16Array 音訊格式
  • 呼叫此方法前必須處於已連線狀態

answer()
「answer」的直接連結

觸發語音 Provider 產生回應。

answer(): Promise<void>

用途:

  • 傳送訊號給語音 Provider 以產生回應
  • 在即時對話中用於提示 AI 回應
  • 回應會透過事件系統發出(例如 'speaking' 事件)

addTools()
「addtools」的直接連結

為語音 Provider 配備可在對話期間使用的 Tool。

addTools(tools: Array<Tool>): void

用途:

  • 加入語音 Provider 可在對話期間使用的 Tool
  • Tool 可以擴充語音 Provider 的功能
  • 實作因 Provider 而異

close()
「close」的直接連結

中斷 WebSocket 或 WebRTC 連線。

close(): void

用途:

  • 關閉與語音服務的連線
  • 清除資源並停止所有進行中的即時處理
  • 語音執行個體使用完畢後應呼叫此方法

on()
「on」的直接連結

註冊語音事件的事件監聽器。

on<E extends VoiceEventType>(
event: E,
callback: (data: E extends keyof VoiceEventMap ? VoiceEventMap[E] : unknown) => void,
): void

用途:

  • 註冊回呼函式,在指定事件發生時呼叫
  • 標準事件包括 'speaking'、'writing' 和 'error'
  • Provider 也可以發出自訂事件
  • 事件資料結構取決於事件類型

off()
「off」的直接連結

移除事件監聽器。

off<E extends VoiceEventType>(
event: E,
callback: (data: E extends keyof VoiceEventMap ? VoiceEventMap[E] : unknown) => void,
): void

用途:

  • 移除先前註冊的事件監聽器
  • 用於在不再需要事件處理常式時進行清除

事件系統
「事件系統」的直接連結

MastraVoice 類別包含一套用於即時通訊的事件系統。標準事件類型包括:

speaking:

{ text: string; audioStream?: NodeJS.ReadableStream; audio?: Int16Array }
語音 Provider 說話時發出,包含音訊資料

writing:

{ text: string, role: string }
從語音轉錄出文字時發出

error:

{ message: string; code?: string; details?: unknown }
發生錯誤時發出

受保護的屬性
「受保護的屬性」的直接連結

listeningModel?:

BuiltInModelConfig | undefined
語音轉文字模型的設定

speechModel?:

BuiltInModelConfig | undefined
文字轉語音模型的設定

speaker?:

string | undefined
預設的說話者/語音 ID

realtimeConfig?:

{ model?: string; apiKey?: string; options?: unknown } | undefined
即時語音對語音功能的設定

遙測支援
「遙測支援」的直接連結

MastraVoice 透過 traced 方法內建遙測支援;此方法會包裝方法呼叫,以追蹤效能及監控錯誤。

注意事項
「注意事項」的直接連結

  • MastraVoice 是抽象類別,無法直接建立執行個體
  • 實作必須為所有抽象方法提供具體實作
  • 此類別為不同語音服務 Provider 提供一致的介面
  • 語音對語音功能是選用功能,並因 Provider 而異
  • 事件系統可為即時互動進行非同步通訊
  • 所有方法呼叫都會自動處理遙測