chat-flow-ardymalihi 3.0.0 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +9 -1
- package/dist/adapters/db/InMemorySessionRepository.js +0 -15
- package/dist/adapters/db/RedisSessionRepository.js +0 -41
- package/dist/adapters/intent/IntentMatcher.d.ts +0 -41
- package/dist/adapters/intent/IntentMatcher.d.ts.map +0 -1
- package/dist/adapters/intent/IntentMatcher.js +0 -167
- package/dist/adapters/intent/IntentMatcher.js.map +0 -1
- package/dist/adapters/intent/IntentService.d.ts +0 -26
- package/dist/adapters/intent/IntentService.d.ts.map +0 -1
- package/dist/adapters/intent/IntentService.js +0 -65
- package/dist/adapters/intent/IntentService.js.map +0 -1
- package/dist/adapters/intent/MockIntentAdapter.js +0 -29
- package/dist/adapters/intent/MockIntentService.d.ts +0 -7
- package/dist/adapters/intent/MockIntentService.d.ts.map +0 -1
- package/dist/adapters/intent/MockIntentService.js +0 -36
- package/dist/adapters/intent/MockIntentService.js.map +0 -1
- package/dist/adapters/llm/GeminiLLMAdapter.d.ts +0 -10
- package/dist/adapters/llm/GeminiLLMAdapter.d.ts.map +0 -1
- package/dist/adapters/llm/GeminiLLMAdapter.js +0 -102
- package/dist/adapters/llm/GeminiLLMAdapter.js.map +0 -1
- package/dist/adapters/llm/MockLLMAdapter.d.ts +0 -5
- package/dist/adapters/llm/MockLLMAdapter.d.ts.map +0 -1
- package/dist/adapters/llm/MockLLMAdapter.js +0 -31
- package/dist/adapters/llm/MockLLMAdapter.js.map +0 -1
- package/dist/adapters/llm/OllamaLLMAdapter.d.ts +0 -9
- package/dist/adapters/llm/OllamaLLMAdapter.d.ts.map +0 -1
- package/dist/adapters/llm/OllamaLLMAdapter.js +0 -74
- package/dist/adapters/llm/OllamaLLMAdapter.js.map +0 -1
- package/dist/adapters/logger/ConsoleLogger.d.ts +0 -12
- package/dist/adapters/logger/ConsoleLogger.d.ts.map +0 -1
- package/dist/adapters/logger/ConsoleLogger.js +0 -37
- package/dist/adapters/logger/ConsoleLogger.js.map +0 -1
- package/dist/adapters/memory/InMemorySessionRepository.js +0 -15
- package/dist/adapters/redis/RedisSessionRepository.js +0 -41
- package/dist/adapters/repository/InMemoryRepository.d.ts +0 -46
- package/dist/adapters/repository/InMemoryRepository.d.ts.map +0 -1
- package/dist/adapters/repository/InMemoryRepository.js +0 -235
- package/dist/adapters/repository/InMemoryRepository.js.map +0 -1
- package/dist/adapters/repository/IntentRepository.d.ts +0 -15
- package/dist/adapters/repository/IntentRepository.d.ts.map +0 -1
- package/dist/adapters/repository/IntentRepository.js +0 -28
- package/dist/adapters/repository/IntentRepository.js.map +0 -1
- package/dist/adapters/repository/RedisRepository.d.ts +0 -63
- package/dist/adapters/repository/RedisRepository.d.ts.map +0 -1
- package/dist/adapters/repository/RedisRepository.js +0 -586
- package/dist/adapters/repository/RedisRepository.js.map +0 -1
- package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts +0 -33
- package/dist/adapters/storage/RedisAudioStorageAdapter.d.ts.map +0 -1
- package/dist/adapters/storage/RedisAudioStorageAdapter.js +0 -121
- package/dist/adapters/storage/RedisAudioStorageAdapter.js.map +0 -1
- package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts +0 -14
- package/dist/adapters/storage/RedisBufferStorageAdapter.d.ts.map +0 -1
- package/dist/adapters/storage/RedisBufferStorageAdapter.js +0 -94
- package/dist/adapters/storage/RedisBufferStorageAdapter.js.map +0 -1
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts +0 -29
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.js +0 -75
- package/dist/adapters/voice/ElevenLabsVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts +0 -77
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js +0 -187
- package/dist/adapters/voice/GeminiMultimodalLiveAdapter.js.map +0 -1
- package/dist/adapters/voice/GeminiVoiceAdapter.d.ts +0 -36
- package/dist/adapters/voice/GeminiVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GeminiVoiceAdapter.js +0 -134
- package/dist/adapters/voice/GeminiVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/GoogleTTSAdapter.d.ts +0 -61
- package/dist/adapters/voice/GoogleTTSAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GoogleTTSAdapter.js +0 -165
- package/dist/adapters/voice/GoogleTTSAdapter.js.map +0 -1
- package/dist/adapters/voice/GoogleVoiceAdapter.d.ts +0 -33
- package/dist/adapters/voice/GoogleVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/GoogleVoiceAdapter.js +0 -155
- package/dist/adapters/voice/GoogleVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/HybridVoiceAdapter.d.ts +0 -54
- package/dist/adapters/voice/HybridVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/HybridVoiceAdapter.js +0 -102
- package/dist/adapters/voice/HybridVoiceAdapter.js.map +0 -1
- package/dist/adapters/voice/LanguageVoiceMapper.d.ts +0 -60
- package/dist/adapters/voice/LanguageVoiceMapper.d.ts.map +0 -1
- package/dist/adapters/voice/LanguageVoiceMapper.js +0 -130
- package/dist/adapters/voice/LanguageVoiceMapper.js.map +0 -1
- package/dist/adapters/voice/VertexVoiceAdapter.d.ts +0 -32
- package/dist/adapters/voice/VertexVoiceAdapter.d.ts.map +0 -1
- package/dist/adapters/voice/VertexVoiceAdapter.js +0 -179
- package/dist/adapters/voice/VertexVoiceAdapter.js.map +0 -1
- package/dist/adapters/webhook/WebhookService.d.ts +0 -47
- package/dist/adapters/webhook/WebhookService.d.ts.map +0 -1
- package/dist/adapters/webhook/WebhookService.js +0 -265
- package/dist/adapters/webhook/WebhookService.js.map +0 -1
- package/dist/adapters/workflow/MockWorkflowAdapter.d.ts +0 -5
- package/dist/adapters/workflow/MockWorkflowAdapter.d.ts.map +0 -1
- package/dist/adapters/workflow/MockWorkflowAdapter.js +0 -173
- package/dist/adapters/workflow/MockWorkflowAdapter.js.map +0 -1
- package/dist/adapters/workflow/WorkflowAdapter.d.ts +0 -55
- package/dist/adapters/workflow/WorkflowAdapter.d.ts.map +0 -1
- package/dist/adapters/workflow/WorkflowAdapter.js +0 -242
- package/dist/adapters/workflow/WorkflowAdapter.js.map +0 -1
- package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts +0 -10
- package/dist/adapters/workflow/actions/getSupportHoursAction.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/getSupportHoursAction.js +0 -33
- package/dist/adapters/workflow/actions/getSupportHoursAction.js.map +0 -1
- package/dist/adapters/workflow/actions/index.d.ts +0 -6
- package/dist/adapters/workflow/actions/index.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/index.js +0 -22
- package/dist/adapters/workflow/actions/index.js.map +0 -1
- package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts +0 -11
- package/dist/adapters/workflow/actions/pushOutputResultAction.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/pushOutputResultAction.js +0 -31
- package/dist/adapters/workflow/actions/pushOutputResultAction.js.map +0 -1
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts +0 -12
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.d.ts.map +0 -1
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.js +0 -32
- package/dist/adapters/workflow/actions/setWorkflowMessageAction.js.map +0 -1
- package/dist/adapters/workflow/engine/constants.d.ts +0 -3
- package/dist/adapters/workflow/engine/constants.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/constants.js +0 -6
- package/dist/adapters/workflow/engine/constants.js.map +0 -1
- package/dist/adapters/workflow/engine/engine.d.ts +0 -32
- package/dist/adapters/workflow/engine/engine.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/engine.js +0 -623
- package/dist/adapters/workflow/engine/engine.js.map +0 -1
- package/dist/adapters/workflow/engine/event-registry.d.ts +0 -12
- package/dist/adapters/workflow/engine/event-registry.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/event-registry.js +0 -33
- package/dist/adapters/workflow/engine/event-registry.js.map +0 -1
- package/dist/adapters/workflow/engine/interpolator.d.ts +0 -11
- package/dist/adapters/workflow/engine/interpolator.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/interpolator.js +0 -93
- package/dist/adapters/workflow/engine/interpolator.js.map +0 -1
- package/dist/adapters/workflow/engine/registry.d.ts +0 -12
- package/dist/adapters/workflow/engine/registry.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/registry.js +0 -39
- package/dist/adapters/workflow/engine/registry.js.map +0 -1
- package/dist/adapters/workflow/engine/template-registry.d.ts +0 -60
- package/dist/adapters/workflow/engine/template-registry.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/template-registry.js +0 -92
- package/dist/adapters/workflow/engine/template-registry.js.map +0 -1
- package/dist/adapters/workflow/engine/types.d.ts +0 -182
- package/dist/adapters/workflow/engine/types.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/types.js +0 -3
- package/dist/adapters/workflow/engine/types.js.map +0 -1
- package/dist/adapters/workflow/engine/utils/format-utils.d.ts +0 -43
- package/dist/adapters/workflow/engine/utils/format-utils.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/utils/format-utils.js +0 -137
- package/dist/adapters/workflow/engine/utils/format-utils.js.map +0 -1
- package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts +0 -7
- package/dist/adapters/workflow/engine/utils/layout-calculator.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/utils/layout-calculator.js +0 -87
- package/dist/adapters/workflow/engine/utils/layout-calculator.js.map +0 -1
- package/dist/adapters/workflow/engine/utils/slugify.d.ts +0 -2
- package/dist/adapters/workflow/engine/utils/slugify.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/utils/slugify.js +0 -41
- package/dist/adapters/workflow/engine/utils/slugify.js.map +0 -1
- package/dist/adapters/workflow/engine/validator.d.ts +0 -9
- package/dist/adapters/workflow/engine/validator.d.ts.map +0 -1
- package/dist/adapters/workflow/engine/validator.js +0 -425
- package/dist/adapters/workflow/engine/validator.js.map +0 -1
- package/dist/application/ConversationSession.d.ts +0 -23
- package/dist/application/ConversationSession.d.ts.map +0 -1
- package/dist/application/ConversationSession.js +0 -83
- package/dist/application/ConversationSession.js.map +0 -1
- package/dist/application/Message.d.ts +0 -11
- package/dist/application/Message.d.ts.map +0 -1
- package/dist/application/Message.js +0 -30
- package/dist/application/Message.js.map +0 -1
- package/dist/application/Orchestrator.d.ts +0 -18
- package/dist/application/Orchestrator.d.ts.map +0 -1
- package/dist/application/Orchestrator.js +0 -80
- package/dist/application/Orchestrator.js.map +0 -1
- package/dist/application/SessionState.js +0 -2
- package/dist/application/usecases/CreateSession.js +0 -20
- package/dist/application/usecases/HandleUserMessage.js +0 -69
- package/dist/config/ChatFlowConfig.d.ts +0 -66
- package/dist/config/ChatFlowConfig.d.ts.map +0 -1
- package/dist/config/ChatFlowConfig.js +0 -54
- package/dist/config/ChatFlowConfig.js.map +0 -1
- package/dist/config/index.d.ts +0 -2
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -7
- package/dist/config/index.js.map +0 -1
- package/dist/core/entities/ConversationSession.d.ts +0 -58
- package/dist/core/entities/ConversationSession.d.ts.map +0 -1
- package/dist/core/entities/ConversationSession.js +0 -160
- package/dist/core/entities/ConversationSession.js.map +0 -1
- package/dist/core/entities/Message.d.ts +0 -14
- package/dist/core/entities/Message.d.ts.map +0 -1
- package/dist/core/entities/Message.js +0 -32
- package/dist/core/entities/Message.js.map +0 -1
- package/dist/core/errors/ChatFlowError.d.ts +0 -71
- package/dist/core/errors/ChatFlowError.d.ts.map +0 -1
- package/dist/core/errors/ChatFlowError.js +0 -108
- package/dist/core/errors/ChatFlowError.js.map +0 -1
- package/dist/core/errors/index.d.ts +0 -2
- package/dist/core/errors/index.d.ts.map +0 -1
- package/dist/core/errors/index.js +0 -15
- package/dist/core/errors/index.js.map +0 -1
- package/dist/core/utils/AudioStreamBuffer.d.ts +0 -33
- package/dist/core/utils/AudioStreamBuffer.d.ts.map +0 -1
- package/dist/core/utils/AudioStreamBuffer.js +0 -55
- package/dist/core/utils/AudioStreamBuffer.js.map +0 -1
- package/dist/core/utils/AudioUtils.d.ts +0 -41
- package/dist/core/utils/AudioUtils.d.ts.map +0 -1
- package/dist/core/utils/AudioUtils.js +0 -188
- package/dist/core/utils/AudioUtils.js.map +0 -1
- package/dist/core/utils/LanguageDetector.d.ts +0 -52
- package/dist/core/utils/LanguageDetector.d.ts.map +0 -1
- package/dist/core/utils/LanguageDetector.js +0 -173
- package/dist/core/utils/LanguageDetector.js.map +0 -1
- package/dist/core/utils/WavUtils.d.ts +0 -14
- package/dist/core/utils/WavUtils.d.ts.map +0 -1
- package/dist/core/utils/WavUtils.js +0 -37
- package/dist/core/utils/WavUtils.js.map +0 -1
- package/dist/db/InMemoryRepository.d.ts +0 -15
- package/dist/db/InMemoryRepository.d.ts.map +0 -1
- package/dist/db/InMemoryRepository.js +0 -41
- package/dist/db/InMemoryRepository.js.map +0 -1
- package/dist/db/RedisRepository.d.ts +0 -16
- package/dist/db/RedisRepository.d.ts.map +0 -1
- package/dist/db/RedisRepository.js +0 -87
- package/dist/db/RedisRepository.js.map +0 -1
- package/dist/demo/cli-demo.d.ts +0 -2
- package/dist/demo/cli-demo.d.ts.map +0 -1
- package/dist/demo/cli-demo.js +0 -146
- package/dist/demo/cli-demo.js.map +0 -1
- package/dist/demo/console-chat.d.ts +0 -2
- package/dist/demo/console-chat.d.ts.map +0 -1
- package/dist/demo/console-chat.js +0 -148
- package/dist/demo/console-chat.js.map +0 -1
- package/dist/demo/interactive-voice-chat.d.ts +0 -2
- package/dist/demo/interactive-voice-chat.d.ts.map +0 -1
- package/dist/demo/interactive-voice-chat.js +0 -180
- package/dist/demo/interactive-voice-chat.js.map +0 -1
- package/dist/demo/voice-demo.d.ts +0 -2
- package/dist/demo/voice-demo.d.ts.map +0 -1
- package/dist/demo/voice-demo.js +0 -188
- package/dist/demo/voice-demo.js.map +0 -1
- package/dist/domain/conversation/ConversationSession.js +0 -82
- package/dist/domain/conversation/Message.js +0 -33
- package/dist/domain/conversation/SessionState.js +0 -10
- package/dist/index.d.ts +0 -26
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -76
- package/dist/index.js.map +0 -1
- package/dist/intent/IntentService.d.ts +0 -17
- package/dist/intent/IntentService.d.ts.map +0 -1
- package/dist/intent/IntentService.js +0 -57
- package/dist/intent/IntentService.js.map +0 -1
- package/dist/intent/MockIntentService.d.ts +0 -7
- package/dist/intent/MockIntentService.d.ts.map +0 -1
- package/dist/intent/MockIntentService.js +0 -36
- package/dist/intent/MockIntentService.js.map +0 -1
- package/dist/interfaces.d.ts +0 -653
- package/dist/interfaces.d.ts.map +0 -1
- package/dist/interfaces.js +0 -36
- package/dist/interfaces.js.map +0 -1
- package/dist/llm/GeminiLLMAdapter.d.ts +0 -10
- package/dist/llm/GeminiLLMAdapter.d.ts.map +0 -1
- package/dist/llm/GeminiLLMAdapter.js +0 -102
- package/dist/llm/GeminiLLMAdapter.js.map +0 -1
- package/dist/llm/MockLLMAdapter.d.ts +0 -5
- package/dist/llm/MockLLMAdapter.d.ts.map +0 -1
- package/dist/llm/MockLLMAdapter.js +0 -31
- package/dist/llm/MockLLMAdapter.js.map +0 -1
- package/dist/orchestrator/Orchestrator.d.ts +0 -62
- package/dist/orchestrator/Orchestrator.d.ts.map +0 -1
- package/dist/orchestrator/Orchestrator.js +0 -697
- package/dist/orchestrator/Orchestrator.js.map +0 -1
- package/dist/ports/IIntentRepository.d.ts +0 -27
- package/dist/ports/IIntentRepository.d.ts.map +0 -1
- package/dist/ports/IIntentRepository.js +0 -3
- package/dist/ports/IIntentRepository.js.map +0 -1
- package/dist/ports/IntentPort.js +0 -2
- package/dist/ports/LLMPort.js +0 -2
- package/dist/ports/SessionRepository.js +0 -2
- package/dist/ports/WorkflowPort.js +0 -2
- package/dist/scripts/debug-redis.d.ts +0 -2
- package/dist/scripts/debug-redis.d.ts.map +0 -1
- package/dist/scripts/debug-redis.js +0 -55
- package/dist/scripts/debug-redis.js.map +0 -1
- package/dist/scripts/seed-collaborative-intents.d.ts +0 -2
- package/dist/scripts/seed-collaborative-intents.d.ts.map +0 -1
- package/dist/scripts/seed-collaborative-intents.js +0 -90
- package/dist/scripts/seed-collaborative-intents.js.map +0 -1
- package/dist/scripts/test-isolated-config.d.ts +0 -2
- package/dist/scripts/test-isolated-config.d.ts.map +0 -1
- package/dist/scripts/test-isolated-config.js +0 -80
- package/dist/scripts/test-isolated-config.js.map +0 -1
- package/dist/scripts/verify_memory_intents.d.ts +0 -2
- package/dist/scripts/verify_memory_intents.d.ts.map +0 -1
- package/dist/scripts/verify_memory_intents.js +0 -45
- package/dist/scripts/verify_memory_intents.js.map +0 -1
- package/dist/scripts/verify_redis_intents.d.ts +0 -2
- package/dist/scripts/verify_redis_intents.d.ts.map +0 -1
- package/dist/scripts/verify_redis_intents.js +0 -52
- package/dist/scripts/verify_redis_intents.js.map +0 -1
- package/dist/server/ChatFlowWebSocketServer.d.ts +0 -46
- package/dist/server/ChatFlowWebSocketServer.d.ts.map +0 -1
- package/dist/server/ChatFlowWebSocketServer.js +0 -344
- package/dist/server/ChatFlowWebSocketServer.js.map +0 -1
- package/dist/server/realtime-voice-server.d.ts +0 -2
- package/dist/server/realtime-voice-server.d.ts.map +0 -1
- package/dist/server/realtime-voice-server.js +0 -627
- package/dist/server/realtime-voice-server.js.map +0 -1
- package/dist/src/api/routes/tenants.d.ts +0 -3
- package/dist/src/api/routes/tenants.d.ts.map +0 -1
- package/dist/src/api/routes/tenants.js +0 -109
- package/dist/src/api/routes/tenants.js.map +0 -1
- package/dist/utils/crypto.d.ts +0 -7
- package/dist/utils/crypto.d.ts.map +0 -1
- package/dist/utils/crypto.js +0 -35
- package/dist/utils/crypto.js.map +0 -1
- package/dist/utils/encryption-helpers.d.ts +0 -14
- package/dist/utils/encryption-helpers.d.ts.map +0 -1
- package/dist/utils/encryption-helpers.js +0 -49
- package/dist/utils/encryption-helpers.js.map +0 -1
- package/dist/verify_memory_intents.js +0 -44
- package/dist/verify_redis_intents.js +0 -49
- package/dist/workflow/MockWorkflowAdapter.d.ts +0 -5
- package/dist/workflow/MockWorkflowAdapter.d.ts.map +0 -1
- package/dist/workflow/MockWorkflowAdapter.js +0 -162
- package/dist/workflow/MockWorkflowAdapter.js.map +0 -1
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GeminiMultimodalLiveAdapter = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Gemini Multimodal Live Adapter
|
|
6
|
-
*
|
|
7
|
-
* Real-time voice adapter using Gemini's Multimodal Live API.
|
|
8
|
-
* Provides bidirectional streaming for STT + LLM + TTS in a single connection.
|
|
9
|
-
*
|
|
10
|
-
* Features:
|
|
11
|
-
* - Real-time speech-to-text
|
|
12
|
-
* - Streaming LLM responses
|
|
13
|
-
* - Real-time text-to-speech
|
|
14
|
-
* - Low latency (<500ms)
|
|
15
|
-
* - Interruption handling
|
|
16
|
-
*
|
|
17
|
-
* Cost: ~$0.006/minute (all-inclusive)
|
|
18
|
-
*
|
|
19
|
-
* Note: This adapter is designed for WebSocket-based real-time streaming.
|
|
20
|
-
* For batch/turn-based conversations, use GeminiVoiceAdapter instead.
|
|
21
|
-
*/
|
|
22
|
-
class GeminiMultimodalLiveAdapter {
|
|
23
|
-
constructor(apiKey, voiceConfig) {
|
|
24
|
-
this.isConnected = false;
|
|
25
|
-
this.apiKey = apiKey;
|
|
26
|
-
this.voiceConfig = voiceConfig;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Connect to Gemini Multimodal Live API
|
|
30
|
-
* Returns a WebSocket connection for bidirectional streaming
|
|
31
|
-
*/
|
|
32
|
-
async connect() {
|
|
33
|
-
if (this.ws && this.isConnected) {
|
|
34
|
-
return this.ws;
|
|
35
|
-
}
|
|
36
|
-
// Gemini Multimodal Live WebSocket endpoint
|
|
37
|
-
const wsUrl = `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent?key=${this.apiKey}`;
|
|
38
|
-
return new Promise((resolve, reject) => {
|
|
39
|
-
this.ws = new WebSocket(wsUrl);
|
|
40
|
-
this.ws.onopen = () => {
|
|
41
|
-
console.log('[GeminiMultimodalLive] Connected to Gemini');
|
|
42
|
-
this.isConnected = true;
|
|
43
|
-
// Send initial configuration
|
|
44
|
-
this.sendConfig();
|
|
45
|
-
resolve(this.ws);
|
|
46
|
-
};
|
|
47
|
-
this.ws.onerror = (error) => {
|
|
48
|
-
console.error('[GeminiMultimodalLive] Connection error:', error);
|
|
49
|
-
this.isConnected = false;
|
|
50
|
-
reject(error);
|
|
51
|
-
};
|
|
52
|
-
this.ws.onclose = () => {
|
|
53
|
-
console.log('[GeminiMultimodalLive] Connection closed');
|
|
54
|
-
this.isConnected = false;
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Send configuration to Gemini
|
|
60
|
-
*/
|
|
61
|
-
sendConfig() {
|
|
62
|
-
if (!this.ws || !this.isConnected) {
|
|
63
|
-
throw new Error('Not connected to Gemini');
|
|
64
|
-
}
|
|
65
|
-
const config = {
|
|
66
|
-
setup: {
|
|
67
|
-
model: 'models/gemini-2.0-flash-exp',
|
|
68
|
-
generationConfig: {
|
|
69
|
-
responseModalities: ['AUDIO'],
|
|
70
|
-
speechConfig: {
|
|
71
|
-
voiceConfig: {
|
|
72
|
-
prebuiltVoiceConfig: {
|
|
73
|
-
voiceName: this.voiceConfig?.tts?.voice || 'Puck'
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
this.ws.send(JSON.stringify(config));
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Send audio chunk to Gemini for processing
|
|
84
|
-
* @param audioBase64 Base64-encoded audio data
|
|
85
|
-
*/
|
|
86
|
-
async sendAudio(audioBase64) {
|
|
87
|
-
if (!this.ws || !this.isConnected) {
|
|
88
|
-
throw new Error('Not connected to Gemini');
|
|
89
|
-
}
|
|
90
|
-
const message = {
|
|
91
|
-
realtimeInput: {
|
|
92
|
-
mediaChunks: [{
|
|
93
|
-
data: audioBase64,
|
|
94
|
-
mimeType: 'audio/pcm'
|
|
95
|
-
}]
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
this.ws.send(JSON.stringify(message));
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Register callback for receiving responses from Gemini
|
|
102
|
-
* @param callback Function to handle responses (text + audio)
|
|
103
|
-
*/
|
|
104
|
-
onResponse(callback) {
|
|
105
|
-
if (!this.ws) {
|
|
106
|
-
throw new Error('Not connected to Gemini');
|
|
107
|
-
}
|
|
108
|
-
this.ws.onmessage = (event) => {
|
|
109
|
-
try {
|
|
110
|
-
const data = JSON.parse(event.data);
|
|
111
|
-
if (data.serverContent?.modelTurn?.parts) {
|
|
112
|
-
const parts = data.serverContent.modelTurn.parts;
|
|
113
|
-
for (const part of parts) {
|
|
114
|
-
const response = {
|
|
115
|
-
isFinal: data.serverContent.turnComplete || false
|
|
116
|
-
};
|
|
117
|
-
// Extract text
|
|
118
|
-
if (part.text) {
|
|
119
|
-
response.text = part.text;
|
|
120
|
-
}
|
|
121
|
-
// Extract audio
|
|
122
|
-
if (part.inlineData?.data) {
|
|
123
|
-
const audioBase64 = part.inlineData.data;
|
|
124
|
-
response.audio = Uint8Array.from(Buffer.from(audioBase64, 'base64'));
|
|
125
|
-
}
|
|
126
|
-
callback(response);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
console.error('[GeminiMultimodalLive] Error parsing response:', error);
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Disconnect from Gemini
|
|
137
|
-
*/
|
|
138
|
-
disconnect() {
|
|
139
|
-
if (this.ws) {
|
|
140
|
-
this.ws.close();
|
|
141
|
-
this.ws = undefined;
|
|
142
|
-
this.isConnected = false;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Speech-to-text (not used in real-time mode)
|
|
147
|
-
* Use sendAudio() and onResponse() instead for real-time streaming
|
|
148
|
-
*/
|
|
149
|
-
async speechToText(audioBase64, config) {
|
|
150
|
-
throw new Error('speechToText() is not supported in real-time mode. ' +
|
|
151
|
-
'Use connect() + sendAudio() + onResponse() for streaming.');
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Text-to-speech (not used in real-time mode)
|
|
155
|
-
* Use sendAudio() and onResponse() instead for real-time streaming
|
|
156
|
-
*/
|
|
157
|
-
async textToSpeech(text, config) {
|
|
158
|
-
throw new Error('textToSpeech() is not supported in real-time mode. ' +
|
|
159
|
-
'Use connect() + sendAudio() + onResponse() for streaming.');
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Get TTS output format metadata
|
|
163
|
-
* This adapter outputs PCM audio at 24kHz mono
|
|
164
|
-
*/
|
|
165
|
-
getTTSOutputFormat() {
|
|
166
|
-
return {
|
|
167
|
-
format: 'pcm',
|
|
168
|
-
sampleRate: 24000,
|
|
169
|
-
channels: 1,
|
|
170
|
-
bitDepth: 16
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Check if connected to Gemini
|
|
175
|
-
*/
|
|
176
|
-
isConnectedToGemini() {
|
|
177
|
-
return this.isConnected;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Get the underlying WebSocket connection
|
|
181
|
-
*/
|
|
182
|
-
getWebSocket() {
|
|
183
|
-
return this.ws;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
exports.GeminiMultimodalLiveAdapter = GeminiMultimodalLiveAdapter;
|
|
187
|
-
//# sourceMappingURL=GeminiMultimodalLiveAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiMultimodalLiveAdapter.js","sourceRoot":"","sources":["../../../src/adapters/voice/GeminiMultimodalLiveAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { IVoiceAdapter, VoiceConfig, AudioFormatMetadata } from '../../interfaces';
|
|
2
|
-
/**
|
|
3
|
-
* Gemini Voice Adapter
|
|
4
|
-
* Implements voice capabilities using Google's Gemini API
|
|
5
|
-
* Can be used independently of GeminiLLMAdapter
|
|
6
|
-
*/
|
|
7
|
-
export declare class GeminiVoiceAdapter implements IVoiceAdapter {
|
|
8
|
-
private apiKey;
|
|
9
|
-
private voiceConfig?;
|
|
10
|
-
constructor(apiKey: string, voiceConfig?: VoiceConfig);
|
|
11
|
-
/**
|
|
12
|
-
* Convert speech (audio) to text using Gemini's audio input capability
|
|
13
|
-
* @param audioBase64 Base64-encoded audio data (WAV format recommended)
|
|
14
|
-
* @param config Optional STT configuration (overrides constructor config)
|
|
15
|
-
* @returns Transcribed text
|
|
16
|
-
*/
|
|
17
|
-
speechToText(audioBase64: string, config?: VoiceConfig['stt']): Promise<string>;
|
|
18
|
-
/**
|
|
19
|
-
* Convert text to speech (audio) using Gemini's native audio output
|
|
20
|
-
* @param text Text to convert to speech
|
|
21
|
-
* @param config Optional TTS configuration (overrides constructor config)
|
|
22
|
-
* @returns Audio data as Uint8Array (PCM format)
|
|
23
|
-
*/
|
|
24
|
-
textToSpeech(text: string, config?: VoiceConfig['tts']): Promise<Uint8Array>;
|
|
25
|
-
/**
|
|
26
|
-
* Declare the audio format produced by Gemini TTS
|
|
27
|
-
* Used by IAudioStorage for format conversion
|
|
28
|
-
*/
|
|
29
|
-
getTTSOutputFormat(): AudioFormatMetadata;
|
|
30
|
-
/**
|
|
31
|
-
* Declare the expected audio format for Gemini STT
|
|
32
|
-
* Used by IAudioStorage for format conversion
|
|
33
|
-
*/
|
|
34
|
-
getSTTInputFormat(): AudioFormatMetadata;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=GeminiVoiceAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiVoiceAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/voice/GeminiVoiceAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEnF;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEtB,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IAKrD;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAiDrF;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAiDlF;;;OAGG;IACH,kBAAkB,IAAI,mBAAmB;IASzC;;;OAGG;IACH,iBAAiB,IAAI,mBAAmB;CAQ3C"}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GeminiVoiceAdapter = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Gemini Voice Adapter
|
|
6
|
-
* Implements voice capabilities using Google's Gemini API
|
|
7
|
-
* Can be used independently of GeminiLLMAdapter
|
|
8
|
-
*/
|
|
9
|
-
class GeminiVoiceAdapter {
|
|
10
|
-
constructor(apiKey, voiceConfig) {
|
|
11
|
-
this.apiKey = apiKey;
|
|
12
|
-
this.voiceConfig = voiceConfig;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Convert speech (audio) to text using Gemini's audio input capability
|
|
16
|
-
* @param audioBase64 Base64-encoded audio data (WAV format recommended)
|
|
17
|
-
* @param config Optional STT configuration (overrides constructor config)
|
|
18
|
-
* @returns Transcribed text
|
|
19
|
-
*/
|
|
20
|
-
async speechToText(audioBase64, config) {
|
|
21
|
-
const sttConfig = config || this.voiceConfig?.stt;
|
|
22
|
-
const language = sttConfig?.language || 'en-US';
|
|
23
|
-
try {
|
|
24
|
-
const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-lite:generateContent?key=${this.apiKey}`, {
|
|
25
|
-
method: 'POST',
|
|
26
|
-
headers: { 'Content-Type': 'application/json' },
|
|
27
|
-
body: JSON.stringify({
|
|
28
|
-
contents: [{
|
|
29
|
-
role: 'user',
|
|
30
|
-
parts: [
|
|
31
|
-
{ text: "Transcribe the following audio exactly. Do not respond to the audio, just output the transcription." },
|
|
32
|
-
{
|
|
33
|
-
inlineData: {
|
|
34
|
-
mimeType: 'audio/wav',
|
|
35
|
-
data: audioBase64
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
]
|
|
39
|
-
}],
|
|
40
|
-
generationConfig: {
|
|
41
|
-
temperature: 0.1, // Lower temperature for transcription accuracy
|
|
42
|
-
}
|
|
43
|
-
})
|
|
44
|
-
});
|
|
45
|
-
if (!response.ok) {
|
|
46
|
-
const errorText = await response.text();
|
|
47
|
-
throw new Error(`Gemini STT API Error: ${response.status} - ${errorText}`);
|
|
48
|
-
}
|
|
49
|
-
const json = await response.json();
|
|
50
|
-
const transcript = json.candidates?.[0]?.content?.parts?.[0]?.text || '';
|
|
51
|
-
if (!transcript) {
|
|
52
|
-
throw new Error('No transcript returned from Gemini STT');
|
|
53
|
-
}
|
|
54
|
-
return transcript;
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
console.error('Speech-to-Text Error:', error);
|
|
58
|
-
throw new Error(`STT failed: ${error.message}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Convert text to speech (audio) using Gemini's native audio output
|
|
63
|
-
* @param text Text to convert to speech
|
|
64
|
-
* @param config Optional TTS configuration (overrides constructor config)
|
|
65
|
-
* @returns Audio data as Uint8Array (PCM format)
|
|
66
|
-
*/
|
|
67
|
-
async textToSpeech(text, config) {
|
|
68
|
-
const ttsConfig = config || this.voiceConfig?.tts;
|
|
69
|
-
const voice = ttsConfig?.voice || 'Puck'; // Gemini's default voice
|
|
70
|
-
try {
|
|
71
|
-
// Use v1alpha API which supports audio modalities
|
|
72
|
-
const response = await fetch(`https://generativelanguage.googleapis.com/v1alpha/models/gemini-2.0-flash-exp:generateContent?key=${this.apiKey}`, {
|
|
73
|
-
method: 'POST',
|
|
74
|
-
headers: { 'Content-Type': 'application/json' },
|
|
75
|
-
body: JSON.stringify({
|
|
76
|
-
contents: [{
|
|
77
|
-
role: 'user',
|
|
78
|
-
parts: [{ text }]
|
|
79
|
-
}],
|
|
80
|
-
generationConfig: {
|
|
81
|
-
responseModalities: ['AUDIO'],
|
|
82
|
-
speechConfig: {
|
|
83
|
-
voiceConfig: {
|
|
84
|
-
prebuiltVoiceConfig: {
|
|
85
|
-
voiceName: voice
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
})
|
|
91
|
-
});
|
|
92
|
-
if (!response.ok) {
|
|
93
|
-
const errorText = await response.text();
|
|
94
|
-
throw new Error(`Gemini TTS API Error: ${response.status} - ${errorText}`);
|
|
95
|
-
}
|
|
96
|
-
const json = await response.json();
|
|
97
|
-
const audioBase64 = json.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data;
|
|
98
|
-
if (!audioBase64) {
|
|
99
|
-
throw new Error('No audio data received from Gemini TTS');
|
|
100
|
-
}
|
|
101
|
-
return Uint8Array.from(Buffer.from(audioBase64, 'base64'));
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
console.error('Text-to-Speech Error:', error);
|
|
105
|
-
throw new Error(`TTS failed: ${error.message}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Declare the audio format produced by Gemini TTS
|
|
110
|
-
* Used by IAudioStorage for format conversion
|
|
111
|
-
*/
|
|
112
|
-
getTTSOutputFormat() {
|
|
113
|
-
return {
|
|
114
|
-
format: 'pcm',
|
|
115
|
-
sampleRate: 24000,
|
|
116
|
-
channels: 1,
|
|
117
|
-
bitDepth: 16
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Declare the expected audio format for Gemini STT
|
|
122
|
-
* Used by IAudioStorage for format conversion
|
|
123
|
-
*/
|
|
124
|
-
getSTTInputFormat() {
|
|
125
|
-
return {
|
|
126
|
-
format: 'wav',
|
|
127
|
-
sampleRate: 16000,
|
|
128
|
-
channels: 1,
|
|
129
|
-
bitDepth: 16
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
exports.GeminiVoiceAdapter = GeminiVoiceAdapter;
|
|
134
|
-
//# sourceMappingURL=GeminiVoiceAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiVoiceAdapter.js","sourceRoot":"","sources":["../../../src/adapters/voice/GeminiVoiceAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { IVoiceAdapter, VoiceConfig } from '../../interfaces';
|
|
2
|
-
/**
|
|
3
|
-
* Google Cloud Text-to-Speech Adapter
|
|
4
|
-
*
|
|
5
|
-
* Production-ready TTS using Google Cloud Text-to-Speech API
|
|
6
|
-
* - Supports 70+ languages with 400+ voices
|
|
7
|
-
* - Male/female voice options
|
|
8
|
-
* - WaveNet & Neural2 premium voices
|
|
9
|
-
* - SSML support for advanced control
|
|
10
|
-
* - Perfect for Persian, Arabic, Asian languages
|
|
11
|
-
*
|
|
12
|
-
* Pricing:
|
|
13
|
-
* - Standard voices: $4 per 1M characters
|
|
14
|
-
* - WaveNet/Neural2: $16 per 1M characters
|
|
15
|
-
*/
|
|
16
|
-
export declare class GoogleTTSAdapter implements IVoiceAdapter {
|
|
17
|
-
private apiKey;
|
|
18
|
-
private voiceConfig?;
|
|
19
|
-
constructor(apiKey: string, voiceConfig?: VoiceConfig);
|
|
20
|
-
/**
|
|
21
|
-
* Speech-to-text (not implemented - use GeminiVoiceAdapter)
|
|
22
|
-
*/
|
|
23
|
-
speechToText(audioBase64: string, config?: VoiceConfig['stt']): Promise<string>;
|
|
24
|
-
/**
|
|
25
|
-
* Text-to-speech using Google Cloud TTS
|
|
26
|
-
*
|
|
27
|
-
* Features:
|
|
28
|
-
* - Multiple audio formats (LINEAR16, MP3, OGG)
|
|
29
|
-
* - Pitch and speaking rate control
|
|
30
|
-
* - SSML support
|
|
31
|
-
* - Volume gain control
|
|
32
|
-
*
|
|
33
|
-
* @param text Text to convert to speech (or SSML)
|
|
34
|
-
* @param config Optional TTS configuration
|
|
35
|
-
* @returns Audio data as Uint8Array
|
|
36
|
-
*/
|
|
37
|
-
textToSpeech(text: string, config?: VoiceConfig['tts']): Promise<Uint8Array>;
|
|
38
|
-
/**
|
|
39
|
-
* Extract language code from voice ID
|
|
40
|
-
* Examples: 'fa-IR-Standard-A' → 'fa-IR', 'ar-XA-Wavenet-B' → 'ar-XA'
|
|
41
|
-
*/
|
|
42
|
-
private extractLanguageCode;
|
|
43
|
-
/**
|
|
44
|
-
* Validate voice ID format (basic check)
|
|
45
|
-
*/
|
|
46
|
-
private isValidVoiceId;
|
|
47
|
-
/**
|
|
48
|
-
* Check if text is SSML (Speech Synthesis Markup Language)
|
|
49
|
-
*/
|
|
50
|
-
private isSSML;
|
|
51
|
-
/**
|
|
52
|
-
* Extract gender hint from voice variant (A-D typically female, E+ typically male)
|
|
53
|
-
* This is a heuristic and may not always be accurate
|
|
54
|
-
*/
|
|
55
|
-
private extractGender;
|
|
56
|
-
/**
|
|
57
|
-
* Clamp value between min and max
|
|
58
|
-
*/
|
|
59
|
-
private clamp;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=GoogleTTSAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleTTSAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/voice/GoogleTTSAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEtB,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IAKrD;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrF;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAiFlF;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,MAAM;IAId;;;OAGG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGhB"}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GoogleTTSAdapter = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Google Cloud Text-to-Speech Adapter
|
|
6
|
-
*
|
|
7
|
-
* Production-ready TTS using Google Cloud Text-to-Speech API
|
|
8
|
-
* - Supports 70+ languages with 400+ voices
|
|
9
|
-
* - Male/female voice options
|
|
10
|
-
* - WaveNet & Neural2 premium voices
|
|
11
|
-
* - SSML support for advanced control
|
|
12
|
-
* - Perfect for Persian, Arabic, Asian languages
|
|
13
|
-
*
|
|
14
|
-
* Pricing:
|
|
15
|
-
* - Standard voices: $4 per 1M characters
|
|
16
|
-
* - WaveNet/Neural2: $16 per 1M characters
|
|
17
|
-
*/
|
|
18
|
-
class GoogleTTSAdapter {
|
|
19
|
-
constructor(apiKey, voiceConfig) {
|
|
20
|
-
this.apiKey = apiKey;
|
|
21
|
-
this.voiceConfig = voiceConfig;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Speech-to-text (not implemented - use GeminiVoiceAdapter)
|
|
25
|
-
*/
|
|
26
|
-
async speechToText(audioBase64, config) {
|
|
27
|
-
throw new Error('GoogleTTSAdapter does not support STT. Use GeminiVoiceAdapter for STT.');
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Text-to-speech using Google Cloud TTS
|
|
31
|
-
*
|
|
32
|
-
* Features:
|
|
33
|
-
* - Multiple audio formats (LINEAR16, MP3, OGG)
|
|
34
|
-
* - Pitch and speaking rate control
|
|
35
|
-
* - SSML support
|
|
36
|
-
* - Volume gain control
|
|
37
|
-
*
|
|
38
|
-
* @param text Text to convert to speech (or SSML)
|
|
39
|
-
* @param config Optional TTS configuration
|
|
40
|
-
* @returns Audio data as Uint8Array
|
|
41
|
-
*/
|
|
42
|
-
async textToSpeech(text, config) {
|
|
43
|
-
const ttsConfig = config || this.voiceConfig?.tts;
|
|
44
|
-
const voiceId = ttsConfig?.voice || 'en-US-Standard-A';
|
|
45
|
-
const languageCode = this.extractLanguageCode(voiceId);
|
|
46
|
-
const startTime = Date.now();
|
|
47
|
-
try {
|
|
48
|
-
// Validate text
|
|
49
|
-
if (!text || text.trim().length === 0) {
|
|
50
|
-
throw new Error('Text input is empty');
|
|
51
|
-
}
|
|
52
|
-
// Validate voice ID format
|
|
53
|
-
if (!this.isValidVoiceId(voiceId)) {
|
|
54
|
-
console.warn(`[GoogleTTSAdapter] Invalid voice ID format: ${voiceId}. Using default.`);
|
|
55
|
-
}
|
|
56
|
-
// Build request payload
|
|
57
|
-
const payload = {
|
|
58
|
-
input: this.isSSML(text) ? { ssml: text } : { text },
|
|
59
|
-
voice: {
|
|
60
|
-
languageCode: languageCode,
|
|
61
|
-
name: voiceId,
|
|
62
|
-
// Optional: Add SSML gender hint for better selection
|
|
63
|
-
...(this.extractGender(voiceId) && { ssmlGender: this.extractGender(voiceId) })
|
|
64
|
-
},
|
|
65
|
-
audioConfig: {
|
|
66
|
-
audioEncoding: 'LINEAR16', // PCM 16-bit (compatible with most systems)
|
|
67
|
-
speakingRate: this.clamp(ttsConfig?.speakingRate || 1.0, 0.25, 4.0),
|
|
68
|
-
pitch: this.clamp(ttsConfig?.pitch || 0.0, -20.0, 20.0),
|
|
69
|
-
volumeGainDb: 0.0, // Default volume
|
|
70
|
-
sampleRateHertz: 24000 // High quality
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
const response = await fetch(`https://texttospeech.googleapis.com/v1/text:synthesize?key=${this.apiKey}`, {
|
|
74
|
-
method: 'POST',
|
|
75
|
-
headers: { 'Content-Type': 'application/json' },
|
|
76
|
-
body: JSON.stringify(payload)
|
|
77
|
-
});
|
|
78
|
-
if (!response.ok) {
|
|
79
|
-
const errorData = await response.json().catch(() => ({ error: { message: 'Unknown error' } }));
|
|
80
|
-
const errorMessage = errorData.error?.message || `HTTP ${response.status}`;
|
|
81
|
-
// Provide helpful error messages
|
|
82
|
-
if (response.status === 400) {
|
|
83
|
-
throw new Error(`Invalid request: ${errorMessage}. Check voice ID and language code.`);
|
|
84
|
-
}
|
|
85
|
-
else if (response.status === 403) {
|
|
86
|
-
throw new Error(`API not enabled or invalid key: ${errorMessage}. Enable Cloud Text-to-Speech API.`);
|
|
87
|
-
}
|
|
88
|
-
else if (response.status === 429) {
|
|
89
|
-
throw new Error(`Quota exceeded: ${errorMessage}. Check your Google Cloud quota.`);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
throw new Error(`Google TTS API Error (${response.status}): ${errorMessage}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
const json = await response.json();
|
|
96
|
-
const audioBase64 = json.audioContent;
|
|
97
|
-
if (!audioBase64) {
|
|
98
|
-
throw new Error('No audio data received from Google TTS');
|
|
99
|
-
}
|
|
100
|
-
const audioData = Uint8Array.from(Buffer.from(audioBase64, 'base64'));
|
|
101
|
-
const duration = Date.now() - startTime;
|
|
102
|
-
console.log(`[GoogleTTSAdapter] TTS successful: ${audioData.length} bytes, ${text.length} chars, ${duration}ms (voice: ${voiceId})`);
|
|
103
|
-
return audioData;
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
const duration = Date.now() - startTime;
|
|
107
|
-
console.error(`[GoogleTTSAdapter] TTS Error after ${duration}ms:`, error.message);
|
|
108
|
-
throw new Error(`Google TTS failed: ${error.message}`);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Extract language code from voice ID
|
|
113
|
-
* Examples: 'fa-IR-Standard-A' → 'fa-IR', 'ar-XA-Wavenet-B' → 'ar-XA'
|
|
114
|
-
*/
|
|
115
|
-
extractLanguageCode(voiceId) {
|
|
116
|
-
const parts = voiceId.split('-');
|
|
117
|
-
if (parts.length >= 2) {
|
|
118
|
-
return `${parts[0]}-${parts[1]}`;
|
|
119
|
-
}
|
|
120
|
-
console.warn(`[GoogleTTSAdapter] Could not extract language code from: ${voiceId}`);
|
|
121
|
-
return 'en-US'; // Fallback
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Validate voice ID format (basic check)
|
|
125
|
-
*/
|
|
126
|
-
isValidVoiceId(voiceId) {
|
|
127
|
-
// Google voice IDs format: {lang}-{region}-{type}-{variant}
|
|
128
|
-
// e.g., 'en-US-Standard-A', 'fa-IR-Wavenet-B'
|
|
129
|
-
const pattern = /^[a-z]{2,3}-[A-Z]{2}-(Standard|Wavenet|Neural2|Studio|Journey|News|Polyglot)-[A-Za-z]$/;
|
|
130
|
-
return pattern.test(voiceId);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Check if text is SSML (Speech Synthesis Markup Language)
|
|
134
|
-
*/
|
|
135
|
-
isSSML(text) {
|
|
136
|
-
return text.trim().startsWith('<speak>') && text.trim().endsWith('</speak>');
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Extract gender hint from voice variant (A-D typically female, E+ typically male)
|
|
140
|
-
* This is a heuristic and may not always be accurate
|
|
141
|
-
*/
|
|
142
|
-
extractGender(voiceId) {
|
|
143
|
-
const variant = voiceId.split('-').pop();
|
|
144
|
-
if (!variant)
|
|
145
|
-
return null;
|
|
146
|
-
// Google's general pattern (not guaranteed):
|
|
147
|
-
// A, B, C, D = Female
|
|
148
|
-
// E, F, G, H = Male
|
|
149
|
-
const femaleVariants = ['A', 'B', 'C', 'D'];
|
|
150
|
-
const maleVariants = ['E', 'F', 'G', 'H'];
|
|
151
|
-
if (femaleVariants.includes(variant))
|
|
152
|
-
return 'FEMALE';
|
|
153
|
-
if (maleVariants.includes(variant))
|
|
154
|
-
return 'MALE';
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Clamp value between min and max
|
|
159
|
-
*/
|
|
160
|
-
clamp(value, min, max) {
|
|
161
|
-
return Math.max(min, Math.min(max, value));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
exports.GoogleTTSAdapter = GoogleTTSAdapter;
|
|
165
|
-
//# sourceMappingURL=GoogleTTSAdapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleTTSAdapter.js","sourceRoot":"","sources":["../../../src/adapters/voice/GoogleTTSAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { IVoiceAdapter, VoiceConfig, AudioFormatMetadata } from '../../interfaces';
|
|
2
|
-
/**
|
|
3
|
-
* Google Voice Adapter
|
|
4
|
-
* Uses Google services exclusively:
|
|
5
|
-
* - Gemini API for STT (Speech-to-Text)
|
|
6
|
-
* - Google Cloud Text-to-Speech API for TTS
|
|
7
|
-
*
|
|
8
|
-
* Outputs standard LINEAR16 PCM audio for perfect concatenation
|
|
9
|
-
*/
|
|
10
|
-
export declare class GoogleVoiceAdapter implements IVoiceAdapter {
|
|
11
|
-
private apiKey;
|
|
12
|
-
private voiceConfig?;
|
|
13
|
-
private ttsClient;
|
|
14
|
-
constructor(apiKey: string, voiceConfig?: VoiceConfig);
|
|
15
|
-
/**
|
|
16
|
-
* Convert speech (audio) to text using Gemini's audio input capability
|
|
17
|
-
*/
|
|
18
|
-
speechToText(audioBase64: string, config?: VoiceConfig['stt']): Promise<string>;
|
|
19
|
-
/**
|
|
20
|
-
* Convert text to speech using Google Cloud Text-to-Speech API
|
|
21
|
-
* Supports both API key and service account authentication
|
|
22
|
-
*/
|
|
23
|
-
textToSpeech(text: string, config?: VoiceConfig['tts']): Promise<Uint8Array>;
|
|
24
|
-
/**
|
|
25
|
-
* Declare the audio format produced by Google TTS
|
|
26
|
-
*/
|
|
27
|
-
getTTSOutputFormat(): AudioFormatMetadata;
|
|
28
|
-
/**
|
|
29
|
-
* Declare the expected audio format for Gemini STT
|
|
30
|
-
*/
|
|
31
|
-
getSTTInputFormat(): AudioFormatMetadata;
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=GoogleVoiceAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleVoiceAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/voice/GoogleVoiceAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGnF;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACpD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,SAAS,CAAqB;gBAE1B,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW;IAMrD;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAiDrF;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IA0ElF;;OAEG;IACH,kBAAkB,IAAI,mBAAmB;IASzC;;OAEG;IACH,iBAAiB,IAAI,mBAAmB;CAQ3C"}
|