{"version":3,"sources":["../../src/inference/tts.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { once } from 'node:events';\nimport type { AddressInfo } from 'node:net';\nimport { beforeAll, describe, expect, it, vi } from 'vitest';\nimport { type WebSocket, WebSocketServer } from 'ws';\nimport * as agents from '../index.js';\nimport { normalizeLanguage } from '../language.js';\nimport { initializeLogger } from '../log.js';\nimport { type APIConnectOptions, DEFAULT_API_CONNECT_OPTIONS } from '../types.js';\nimport { STT } from './stt.js';\nimport { describeLiveKitInference } from './test_utils.js';\nimport {\n  TTS,\n  type TTSFallbackModel,\n  hasAlignedTranscript,\n  normalizeTTSFallback,\n  parseTTSModelString,\n} from './tts.js';\n\nbeforeAll(() => {\n  initializeLogger({ level: 'silent', pretty: false });\n});\n\n/** Helper to create TTS with required credentials. */\nfunction makeTts(overrides: Record<string, unknown> = {}) {\n  const defaults = {\n    model: 'cartesia/sonic' as const,\n    apiKey: 'test-key',\n    apiSecret: 'test-secret',\n    baseURL: 'https://example.livekit.cloud',\n  };\n  return new TTS({ ...defaults, ...overrides });\n}\n\ndescribe('Inference TTS connection', () => {\n  it('includes the model in the dial URL', async () => {\n    const server = new WebSocketServer({ host: '127.0.0.1', port: 0 });\n    await once(server, 'listening');\n    const address = server.address() as AddressInfo;\n    let resolveRequestUrl!: (url: string) => void;\n    const requestUrl = new Promise<string>((resolve) => {\n      resolveRequestUrl = resolve;\n    });\n\n    server.on('connection', (_socket, request) => {\n      resolveRequestUrl(request.url ?? '');\n    });\n\n    const tts = makeTts({\n      model: 'cartesia/sonic-3',\n      baseURL: `http://127.0.0.1:${address.port}`,\n    });\n    let socket: WebSocket | undefined;\n\n    try {\n      socket = await tts.connectWs(1_000);\n\n      expect(new URL(await requestUrl, 'ws://127.0.0.1').searchParams.get('model')).toBe(\n        'cartesia/sonic-3',\n      );\n    } finally {\n      socket?.terminate();\n      for (const client of server.clients) client.terminate();\n      await tts.close();\n      await new Promise<void>((resolve) => server.close(() => resolve()));\n    }\n  });\n});\n\ndescribe('parseTTSModelString', () => {\n  it('simple model without voice', () => {\n    const [model, voice] = parseTTSModelString('cartesia');\n    expect(model).toBe('cartesia');\n    expect(voice).toBeUndefined();\n  });\n\n  it('model with voice suffix', () => {\n    const [model, voice] = parseTTSModelString('cartesia:my-voice-id');\n    expect(model).toBe('cartesia');\n    expect(voice).toBe('my-voice-id');\n  });\n\n  it('provider/model format without voice', () => {\n    const [model, voice] = parseTTSModelString('cartesia/sonic');\n    expect(model).toBe('cartesia/sonic');\n    expect(voice).toBeUndefined();\n  });\n\n  it('provider/model format with voice', () => {\n    const [model, voice] = parseTTSModelString('cartesia/sonic:my-voice-id');\n    expect(model).toBe('cartesia/sonic');\n    expect(voice).toBe('my-voice-id');\n  });\n\n  it.each([\n    ['deepgram/aura-2:voice123', 'deepgram/aura-2', 'voice123'],\n    ['rime:speaker-a', 'rime', 'speaker-a'],\n    ['rime/mist:narrator', 'rime/mist', 'narrator'],\n    ['inworld/inworld-tts-1:character', 'inworld/inworld-tts-1', 'character'],\n    ['cartesia/sonic-turbo:deep-voice', 'cartesia/sonic-turbo', 'deep-voice'],\n  ])('various providers and voices: %s', (modelStr, expectedModel, expectedVoice) => {\n    const [model, voice] = parseTTSModelString(modelStr);\n    expect(model).toBe(expectedModel);\n    expect(voice).toBe(expectedVoice);\n  });\n\n  it('empty voice after colon', () => {\n    const [model, voice] = parseTTSModelString('cartesia/sonic:');\n    expect(model).toBe('cartesia/sonic');\n    expect(voice).toBe('');\n  });\n});\n\ndescribe('normalizeTTSFallback', () => {\n  it('single string model', () => {\n    const result = normalizeTTSFallback('cartesia/sonic');\n    expect(result).toEqual([{ model: 'cartesia/sonic', voice: '' }]);\n  });\n\n  it('single string model with voice', () => {\n    const result = normalizeTTSFallback('cartesia/sonic:my-voice');\n    expect(result).toEqual([{ model: 'cartesia/sonic', voice: 'my-voice' }]);\n  });\n\n  it('single FallbackModel dict', () => {\n    const fallback: TTSFallbackModel = { model: 'cartesia/sonic', voice: 'narrator' };\n    const result = normalizeTTSFallback(fallback);\n    expect(result).toEqual([{ model: 'cartesia/sonic', voice: 'narrator' }]);\n  });\n\n  it('list of string models', () => {\n    const result = normalizeTTSFallback(['cartesia/sonic', 'deepgram/aura-2']);\n    expect(result).toEqual([\n      { model: 'cartesia/sonic', voice: '' },\n      { model: 'deepgram/aura-2', voice: '' },\n    ]);\n  });\n\n  it('list of string models with voices', () => {\n    const result = normalizeTTSFallback(['cartesia/sonic:voice1', 'deepgram/aura-2:voice2']);\n    expect(result).toEqual([\n      { model: 'cartesia/sonic', voice: 'voice1' },\n      { model: 'deepgram/aura-2', voice: 'voice2' },\n    ]);\n  });\n\n  it('list of FallbackModel dicts', () => {\n    const fallbacks: TTSFallbackModel[] = [\n      { model: 'cartesia/sonic', voice: 'narrator' },\n      { model: 'deepgram/aura-2', voice: '' },\n    ];\n    const result = normalizeTTSFallback(fallbacks);\n    expect(result).toEqual([\n      { model: 'cartesia/sonic', voice: 'narrator' },\n      { model: 'deepgram/aura-2', voice: '' },\n    ]);\n  });\n\n  it('mixed list of strings and dicts', () => {\n    const result = normalizeTTSFallback([\n      'cartesia/sonic:voice1',\n      { model: 'deepgram/aura-2', voice: 'custom' } as TTSFallbackModel,\n      'rime/mist',\n    ]);\n    expect(result).toEqual([\n      { model: 'cartesia/sonic', voice: 'voice1' },\n      { model: 'deepgram/aura-2', voice: 'custom' },\n      { model: 'rime/mist', voice: '' },\n    ]);\n  });\n\n  it('FallbackModel with extraKwargs is preserved', () => {\n    const fallback: TTSFallbackModel = {\n      model: 'cartesia/sonic',\n      voice: 'narrator',\n      extraKwargs: { duration: 30.0, speed: 'fast' },\n    };\n    const result = normalizeTTSFallback(fallback);\n    expect(result).toEqual([\n      {\n        model: 'cartesia/sonic',\n        voice: 'narrator',\n        extraKwargs: { duration: 30.0, speed: 'fast' },\n      },\n    ]);\n  });\n\n  it('list with extraKwargs preserved', () => {\n    const result = normalizeTTSFallback([\n      { model: 'cartesia/sonic', voice: 'v1', extraKwargs: { speed: 'slow' } } as TTSFallbackModel,\n      'deepgram/aura-2:voice2',\n      { model: 'rime/mist', voice: '', extraKwargs: { custom: true } } as TTSFallbackModel,\n    ]);\n    expect(result).toEqual([\n      { model: 'cartesia/sonic', voice: 'v1', extraKwargs: { speed: 'slow' } },\n      { model: 'deepgram/aura-2', voice: 'voice2' },\n      { model: 'rime/mist', voice: '', extraKwargs: { custom: true } },\n    ]);\n  });\n\n  it('empty list returns empty list', () => {\n    const result = normalizeTTSFallback([]);\n    expect(result).toEqual([]);\n  });\n\n  it('FallbackModel with empty voice', () => {\n    const fallback: TTSFallbackModel = { model: 'cartesia/sonic', voice: '' };\n    const result = normalizeTTSFallback(fallback);\n    expect(result).toEqual([{ model: 'cartesia/sonic', voice: '' }]);\n  });\n});\n\ndescribe('TTS constructor fallback and connOptions', () => {\n  it('normalizes language in constructor', () => {\n    const tts = makeTts({ language: 'english' });\n    expect(tts['opts'].language).toBe('en');\n  });\n\n  it('normalizes updated language values', () => {\n    const tts = makeTts();\n    tts.updateOptions({ language: 'en_US' });\n    expect(tts['opts'].language).toBe(normalizeLanguage('en_US'));\n  });\n\n  it('fallback not given defaults to undefined', () => {\n    const tts = makeTts();\n    expect(tts['opts'].fallback).toBeUndefined();\n  });\n\n  it('fallback single string is normalized', () => {\n    const tts = makeTts({ fallback: 'deepgram/aura-2' });\n    expect(tts['opts'].fallback).toEqual([{ model: 'deepgram/aura-2', voice: '' }]);\n  });\n\n  it('fallback single string with voice is normalized', () => {\n    const tts = makeTts({ fallback: 'cartesia/sonic:my-voice' });\n    expect(tts['opts'].fallback).toEqual([{ model: 'cartesia/sonic', voice: 'my-voice' }]);\n  });\n\n  it('fallback list of strings is normalized', () => {\n    const tts = makeTts({ fallback: ['cartesia/sonic', 'deepgram/aura-2'] });\n    expect(tts['opts'].fallback).toEqual([\n      { model: 'cartesia/sonic', voice: '' },\n      { model: 'deepgram/aura-2', voice: '' },\n    ]);\n  });\n\n  it('fallback single FallbackModel is normalized to list', () => {\n    const tts = makeTts({ fallback: { model: 'cartesia/sonic', voice: 'narrator' } });\n    expect(tts['opts'].fallback).toEqual([{ model: 'cartesia/sonic', voice: 'narrator' }]);\n  });\n\n  it('fallback with extraKwargs is preserved', () => {\n    const tts = makeTts({\n      fallback: {\n        model: 'cartesia/sonic',\n        voice: 'narrator',\n        extraKwargs: { duration: 30.0, speed: 'fast' },\n      },\n    });\n    expect(tts['opts'].fallback).toEqual([\n      {\n        model: 'cartesia/sonic',\n        voice: 'narrator',\n        extraKwargs: { duration: 30.0, speed: 'fast' },\n      },\n    ]);\n  });\n\n  it('fallback mixed list is normalized', () => {\n    const tts = makeTts({\n      fallback: [\n        'cartesia/sonic:voice1',\n        { model: 'deepgram/aura-2', voice: 'custom', extraKwargs: { mip_opt_out: true } },\n        'rime/mist',\n      ],\n    });\n    expect(tts['opts'].fallback).toEqual([\n      { model: 'cartesia/sonic', voice: 'voice1' },\n      { model: 'deepgram/aura-2', voice: 'custom', extraKwargs: { mip_opt_out: true } },\n      { model: 'rime/mist', voice: '' },\n    ]);\n  });\n\n  it('connOptions not given uses default', () => {\n    const tts = makeTts();\n    expect(tts['opts'].connOptions).toEqual(DEFAULT_API_CONNECT_OPTIONS);\n  });\n\n  it('connOptions custom timeout', () => {\n    const custom: APIConnectOptions = { timeoutMs: 30000, maxRetry: 3, retryIntervalMs: 2000 };\n    const tts = makeTts({ connOptions: custom });\n    expect(tts['opts'].connOptions).toEqual(custom);\n    expect(tts['opts'].connOptions!.timeoutMs).toBe(30000);\n  });\n\n  it('connOptions custom maxRetry', () => {\n    const custom: APIConnectOptions = { timeoutMs: 10000, maxRetry: 5, retryIntervalMs: 2000 };\n    const tts = makeTts({ connOptions: custom });\n    expect(tts['opts'].connOptions).toEqual(custom);\n    expect(tts['opts'].connOptions!.maxRetry).toBe(5);\n  });\n\n  it('connOptions full custom', () => {\n    const custom: APIConnectOptions = { timeoutMs: 60000, maxRetry: 10, retryIntervalMs: 2000 };\n    const tts = makeTts({ connOptions: custom });\n    expect(tts['opts'].connOptions).toEqual(custom);\n    expect(tts['opts'].connOptions!.timeoutMs).toBe(60000);\n    expect(tts['opts'].connOptions!.maxRetry).toBe(10);\n    expect(tts['opts'].connOptions!.retryIntervalMs).toBe(2000);\n  });\n});\n\ndescribe('TTS provider modelOptions', () => {\n  it('accepts expanded Cartesia inference model options', () => {\n    const modelOptions = {\n      speed: 1.15,\n      emotion: 'curious',\n      add_timestamps: true,\n    };\n\n    const tts = new TTS({\n      model: 'cartesia/sonic' as const,\n      apiKey: 'test-key',\n      apiSecret: 'test-secret',\n      baseURL: 'https://example.livekit.cloud',\n      modelOptions,\n    });\n\n    expect(tts['opts'].modelOptions).toEqual(modelOptions);\n  });\n\n  it('accepts Deepgram inference model options', () => {\n    const modelOptions = { mip_opt_out: true };\n\n    const tts = new TTS({\n      model: 'deepgram/aura-2' as const,\n      apiKey: 'test-key',\n      apiSecret: 'test-secret',\n      baseURL: 'https://example.livekit.cloud',\n      modelOptions,\n    });\n\n    expect(tts['opts'].modelOptions).toEqual(modelOptions);\n  });\n\n  it('accepts Rime inference model options', () => {\n    const modelOptions = {\n      speed_alpha: 0.9,\n      pause_between_brackets: true,\n    };\n\n    const tts = new TTS({\n      model: 'rime/mistv2' as const,\n      apiKey: 'test-key',\n      apiSecret: 'test-secret',\n      baseURL: 'https://example.livekit.cloud',\n      modelOptions,\n    });\n\n    expect(tts['opts'].modelOptions).toEqual(modelOptions);\n  });\n\n  it('accepts Inworld inference model options', () => {\n    const modelOptions = {\n      timestamp_type: 'WORD' as const,\n      apply_text_normalization: 'ON' as const,\n    };\n\n    const tts = new TTS({\n      model: 'inworld/inworld-tts-1' as const,\n      apiKey: 'test-key',\n      apiSecret: 'test-secret',\n      baseURL: 'https://example.livekit.cloud',\n      modelOptions,\n    });\n\n    expect(tts['opts'].modelOptions).toEqual(modelOptions);\n  });\n});\n\ndescribe('hasAlignedTranscript', () => {\n  it('returns false for unknown provider', () => {\n    expect(hasAlignedTranscript('rime/mistv2', { add_timestamps: true })).toBe(false);\n    expect(hasAlignedTranscript('deepgram/aura-2', { timestamp_type: 'WORD' })).toBe(false);\n  });\n\n  it('returns false for an empty options payload', () => {\n    expect(hasAlignedTranscript('cartesia/sonic', {})).toBe(false);\n    expect(hasAlignedTranscript('inworld/inworld-tts-1', undefined)).toBe(false);\n    expect(hasAlignedTranscript(undefined, { add_timestamps: true })).toBe(false);\n  });\n\n  it('detects Cartesia add_timestamps opt-in', () => {\n    expect(hasAlignedTranscript('cartesia/sonic', { add_timestamps: true })).toBe(true);\n    expect(hasAlignedTranscript('cartesia/sonic-3', { add_timestamps: false })).toBe(false);\n  });\n\n  it('detects Inworld WORD/CHARACTER timestamp types', () => {\n    expect(hasAlignedTranscript('inworld/inworld-tts-1', { timestamp_type: 'WORD' })).toBe(true);\n    expect(hasAlignedTranscript('inworld/inworld-tts-1', { timestamp_type: 'CHARACTER' })).toBe(\n      true,\n    );\n    expect(\n      hasAlignedTranscript('inworld/inworld-tts-1', {\n        timestamp_type: 'TIMESTAMP_TYPE_UNSPECIFIED',\n      }),\n    ).toBe(false);\n  });\n});\n\ndescribe('TTS alignedTranscript capability', () => {\n  it('defaults to alignedTranscript=false when no opt-in is provided', () => {\n    const tts = makeTts();\n    expect(tts.capabilities.alignedTranscript).toBe(false);\n  });\n\n  it('reports alignedTranscript=true when Cartesia add_timestamps is set', () => {\n    const tts = makeTts({\n      model: 'cartesia/sonic',\n      modelOptions: { add_timestamps: true },\n    });\n    expect(tts.capabilities.alignedTranscript).toBe(true);\n  });\n\n  it('reports alignedTranscript=true when Inworld timestamp_type is WORD', () => {\n    const tts = makeTts({\n      model: 'inworld/inworld-tts-1',\n      modelOptions: { timestamp_type: 'WORD' },\n    });\n    expect(tts.capabilities.alignedTranscript).toBe(true);\n  });\n\n  it('recomputes alignedTranscript when updateOptions changes modelOptions', () => {\n    const tts = makeTts({ model: 'cartesia/sonic' });\n    expect(tts.capabilities.alignedTranscript).toBe(false);\n\n    tts.updateOptions({ modelOptions: { add_timestamps: true } });\n    expect(tts.capabilities.alignedTranscript).toBe(true);\n\n    tts.updateOptions({ modelOptions: { add_timestamps: false } });\n    expect(tts.capabilities.alignedTranscript).toBe(false);\n  });\n\n  it('recomputes alignedTranscript when updateOptions changes the model', () => {\n    const tts = makeTts({\n      model: 'cartesia/sonic',\n      modelOptions: { timestamp_type: 'WORD' },\n    });\n    expect(tts.capabilities.alignedTranscript).toBe(false);\n\n    tts.updateOptions({ model: 'inworld/inworld-tts-1' });\n    expect(tts.capabilities.alignedTranscript).toBe(true);\n  });\n\n  it('invalidates the connection pool when session-affecting options change', () => {\n    const tts = makeTts({ model: 'cartesia/sonic' });\n    const invalidateSpy = vi.spyOn(tts.pool, 'invalidate');\n\n    tts.updateOptions({ modelOptions: { add_timestamps: true } });\n    expect(invalidateSpy).toHaveBeenCalledTimes(1);\n\n    tts.updateOptions({ model: 'deepgram/aura-2' });\n    expect(invalidateSpy).toHaveBeenCalledTimes(2);\n\n    tts.updateOptions({ voice: 'narrator' });\n    expect(invalidateSpy).toHaveBeenCalledTimes(3);\n\n    tts.updateOptions({ language: 'en' });\n    expect(invalidateSpy).toHaveBeenCalledTimes(4);\n\n    // Empty update should not churn the pool.\n    tts.updateOptions({});\n    expect(invalidateSpy).toHaveBeenCalledTimes(4);\n  });\n});\n\ndescribeLiveKitInference('LiveKit Inference TTS integration', agents, async (harness) => {\n  const models = [\n    {\n      model: 'cartesia/sonic-3',\n      voice: '9626c31c-bec5-4cca-baa8-f8ba9e84c8bc',\n    },\n    { model: 'inworld/inworld-tts-2', voice: 'Ashley' },\n    { model: 'rime/coda', voice: 'celeste' },\n  ] as const;\n\n  for (const options of models) {\n    describe(options.model, async () => {\n      await harness.tts(\n        new TTS(options),\n        new STT({\n          model: 'deepgram/nova-3',\n          modelOptions: { endpointing: 1000 },\n        }),\n        {\n          streamingValidationStt: true,\n        },\n      );\n    });\n  }\n});\n"],"mappings":"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","names":[]}