メインコンテンツへ移動

Mastra の Voice

Mastra の Voice システムは音声対話のための統一インターフェースを提供し、アプリケーションで Text-to-Speech(TTS)、Speech-to-Text(STT)、リアルタイムの Speech-to-Speech(STS)を利用できるようにします。

Agent に Voice を追加する
Agent に Voice を追加するへの直接リンク

voice プロパティで Voice Provider を Agent に渡します。設定する Provider に応じて、同じプロパティで Text-to-Speech(TTS)、Speech-to-Text(STT)、リアルタイムの Speech-to-Speech(STS)を利用できます。

import { Agent } from '@mastra/core/agent'
import { OpenAIVoice } from '@mastra/voice-openai'

// Initialize OpenAI voice for TTS

const voiceAgent = new Agent({
id: 'voice-agent',
name: 'Voice Agent',
instructions: 'You are a voice assistant that can help users with their tasks.',
model: 'openai/gpt-5.6-sol',
voice: new OpenAIVoice(),
})

これにより、次の Voice 機能を使用できます。

Text-to-Speech(TTS)
Text-to-Speech(TTS)への直接リンク

Mastra の TTS 機能を使って、Agent の回答を自然な音声に変換します。 OpenAI や ElevenLabs など、複数の Provider から選択できます。

詳しい設定オプションと高度な機能については、Text-to-Speech ガイドを参照してください。

import { Agent } from '@mastra/core/agent'
import { OpenAIVoice } from '@mastra/voice-openai'
import { playAudio } from '@mastra/node-audio'

const voiceAgent = new Agent({
id: 'voice-agent',
name: 'Voice Agent',
instructions: 'You are a voice assistant that can help users with their tasks.',
model: 'openai/gpt-5.6-sol',
voice: new OpenAIVoice(),
})

const { text } = await voiceAgent.generate('What color is the sky?')

// Convert text to speech to an Audio Stream
const audioStream = await voiceAgent.voice.speak(text, {
speaker: 'default', // Optional: specify a speaker
responseFormat: 'wav', // Optional: specify a response format
})

playAudio(audioStream)

OpenAI Voice Provider の詳細については、OpenAI Voice リファレンスを参照してください。

Speech-to-Text(STT)
Speech-to-Text(STT)への直接リンク

OpenAI や ElevenLabs などの Provider を使って音声コンテンツを文字起こしします。詳しい設定オプションについては、Speech-to-Textを参照してください。

サンプル音声ファイルはこちらからダウンロードできます。


import { Agent } from '@mastra/core/agent'
import { OpenAIVoice } from '@mastra/voice-openai'
import { createReadStream } from 'fs'

const voiceAgent = new Agent({
id: 'voice-agent',
name: 'Voice Agent',
instructions: 'You are a voice assistant that can help users with their tasks.',
model: 'openai/gpt-5.6-sol',
voice: new OpenAIVoice(),
})

// Use an audio file from a URL
const audioStream = await createReadStream('./how_can_i_help_you.mp3')

// Convert audio to text
const transcript = await voiceAgent.voice.listen(audioStream)
console.log(`User said: ${transcript}`)

// Generate a response based on the transcript
const { text } = await voiceAgent.generate(transcript)

OpenAI Voice Provider の詳細については、OpenAI Voice リファレンスを参照してください。

Speech-to-Speech(STS)
Speech-to-Speech(STS)への直接リンク

Speech-to-Speech 機能で会話体験を構築します。統一 API により、ユーザーと AI Agent 間のリアルタイム音声対話が可能になります。 詳しい設定オプションと高度な機能については、Speech-to-Speechを参照してください。

import { Agent } from '@mastra/core/agent'
import { playAudio, getMicrophoneStream } from '@mastra/node-audio'
import { OpenAIRealtimeVoice } from '@mastra/voice-openai-realtime'

const voiceAgent = new Agent({
id: 'voice-agent',
name: 'Voice Agent',
instructions: 'You are a voice assistant that can help users with their tasks.',
model: 'openai/gpt-5.6-sol',
voice: new OpenAIRealtimeVoice(),
})

// Listen for agent audio responses
voiceAgent.voice.on('speaker', ({ audio }) => {
playAudio(audio)
})

// Initiate the conversation
await voiceAgent.voice.speak('How can I help you today?')

// Send continuous audio from the microphone
const micStream = getMicrophoneStream()
await voiceAgent.voice.send(micStream)

OpenAI Voice Provider の詳細については、OpenAI Voice リファレンスを参照してください。

リアルタイム Voice
リアルタイム Voiceへの直接リンク

ブラウザまたは電話で、ユーザーが割り込んで話せるライブ通話を実行します。Mastra は音声ループを LiveKit に任せ、音声区間検出、意味に基づくターン検出、割り込みを処理します。一方、Agent は独自のモデル、Tools、Memory を使って各応答を生成します。セットアップと設定オプションについては、リアルタイム Voiceを参照してください。

Voice の設定
Voice の設定への直接リンク

各 Voice Provider には、異なるモデルとオプションを設定できます。サポートするすべての Provider の詳しい設定オプションを次に示します。

// OpenAI Voice Configuration
const voice = new OpenAIVoice({
speechModel: {
name: 'gpt-3.5-turbo', // Example model name
apiKey: process.env.OPENAI_API_KEY,
language: 'en-US', // Language code
voiceType: 'neural', // Type of voice model
},
listeningModel: {
name: 'whisper-1', // Example model name
apiKey: process.env.OPENAI_API_KEY,
language: 'en-US', // Language code
format: 'wav', // Audio format
},
speaker: 'alloy', // Example speaker name
})

OpenAI Voice Provider の詳細については、OpenAI Voice リファレンスを参照してください。

複数の Voice Provider を使用する
複数の Voice Provider を使用するへの直接リンク

この例では、Mastra で 2 つの異なる Voice Provider を作成して使用する方法を示します。Speech-to-Text(STT)には OpenAI、Text-to-Speech(TTS)には PlayAI を使用します。

まず、必要な設定を指定して Voice Provider のインスタンスを作成します。

import { OpenAIVoice } from '@mastra/voice-openai'
import { PlayAIVoice } from '@mastra/voice-playai'
import { CompositeVoice } from '@mastra/core/voice'
import { playAudio, getMicrophoneStream } from '@mastra/node-audio'

// Initialize OpenAI voice for STT
const input = new OpenAIVoice({
listeningModel: {
name: 'whisper-1',
apiKey: process.env.OPENAI_API_KEY,
},
})

// Initialize PlayAI voice for TTS
const output = new PlayAIVoice({
speechModel: {
name: 'playai-voice',
apiKey: process.env.PLAYAI_API_KEY,
},
})

// Combine the providers using CompositeVoice
const voice = new CompositeVoice({
input,
output,
})

// Implement voice interactions using the combined voice provider
const audioStream = getMicrophoneStream() // Assume this function gets audio input
const transcript = await voice.listen(audioStream)

// Log the transcribed text
console.log('Transcribed text:', transcript)

// Convert text to speech
const responseAudio = await voice.speak(`You said: ${transcript}`, {
speaker: 'default', // Optional: specify a speaker,
responseFormat: 'wav', // Optional: specify a response format
})

// Play the audio response
playAudio(responseAudio)

AI SDK Model Provider を使用する
AI SDK Model Provider を使用するへの直接リンク

CompositeVoice では AI SDK モデルを直接使用することもできます。

import { CompositeVoice } from '@mastra/core/voice'
import { openai } from '@ai-sdk/openai'
import { elevenlabs } from '@ai-sdk/elevenlabs'
import { playAudio, getMicrophoneStream } from '@mastra/node-audio'

// Use AI SDK models directly - no provider setup needed
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 Mastra providers
const audioStream = getMicrophoneStream()
const transcript = await voice.listen(audioStream)

console.log('Transcribed text:', transcript)

// Convert text to speech
const responseAudio = await voice.speak(`You said: ${transcript}`, {
speaker: 'Rachel', // ElevenLabs voice
})

playAudio(responseAudio)

AI SDK モデルと Mastra Provider を組み合わせることもできます。

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 provider for TTS
})

CompositeVoice の詳細については、CompositeVoice リファレンスを参照してください。

その他のリソース
その他のリソースへの直接リンク