{"version":3,"sources":["../src/exceptions.ts","../src/utils.ts","../src/tts_config.ts","../src/constants.ts","../src/drm.ts","../src/communicate.ts","../src/submaker.ts","../src/voices.ts","../src/simple.ts"],"names":["uuidv4","createHash","escape","HttpsProxyAgent","WebSocket","AxiosError","axios"],"mappings":"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","file":"index.cjs","sourcesContent":["export class EdgeTTSException extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"EdgeTTSException\";\n  }\n}\n\nexport class SkewAdjustmentError extends EdgeTTSException {\n  constructor(message: string) {\n    super(message);\n    this.name = \"SkewAdjustmentError\";\n  }\n}\n\nexport class UnknownResponse extends EdgeTTSException {\n  constructor(message: string) {\n    super(message);\n    this.name = \"UnknownResponse\";\n  }\n}\n\nexport class UnexpectedResponse extends EdgeTTSException {\n  constructor(message: string) {\n    super(message);\n    this.name = \"UnexpectedResponse\";\n  }\n}\n\nexport class NoAudioReceived extends EdgeTTSException {\n  constructor(message: string) {\n    super(message);\n    this.name = \"NoAudioReceived\";\n  }\n}\n\nexport class WebSocketError extends EdgeTTSException {\n  constructor(message: string) {\n    super(message);\n    this.name = \"WebSocketError\";\n  }\n}\n\nexport class ValueError extends EdgeTTSException {\n  constructor(message: string) {\n    super(message);\n    this.name = \"ValueError\";\n  }\n} ","import { v4 as uuidv4 } from 'uuid';\nimport { TTSConfig } from './tts_config';\nimport { ValueError } from \"./exceptions\";\nimport escape from 'xml-escape';\n\nexport function getHeadersAndDataFromText(message: Buffer): [{ [key: string]: string }, Buffer] {\n  const headerLength = message.indexOf('\\r\\n\\r\\n');\n  const headers: { [key: string]: string } = {};\n  const headerString = message.subarray(0, headerLength).toString('utf-8');\n  if (headerString) {\n    const headerLines = headerString.split('\\r\\n');\n    for (const line of headerLines) {\n      const [key, value] = line.split(':', 2);\n      if (key && value) {\n        headers[key] = value.trim();\n      }\n    }\n  }\n\n  return [headers, message.subarray(headerLength + 2)];\n}\n\nexport function getHeadersAndDataFromBinary(message: Buffer): [{ [key: string]: string }, Buffer] {\n  const headerLength = message.readUInt16BE(0);\n  const headers: { [key: string]: string } = {};\n  const headerString = message.subarray(2, headerLength + 2).toString('utf-8');\n  if (headerString) {\n    const headerLines = headerString.split('\\r\\n');\n    for (const line of headerLines) {\n      const [key, value] = line.split(':', 2);\n      if (key && value) {\n        headers[key] = value.trim();\n      }\n    }\n  }\n\n  return [headers, message.subarray(headerLength + 2)];\n}\n\nexport function removeIncompatibleCharacters(text: string): string {\n  return text.replace(/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g, ' ');\n}\n\nexport function connectId(): string {\n  return uuidv4().replace(/-/g, '');\n}\n\nfunction _findLastNewlineOrSpaceWithinLimit(text: Buffer, limit: number): number {\n  const slice = text.subarray(0, limit);\n  let splitAt = slice.lastIndexOf('\\n');\n  if (splitAt < 0) {\n    splitAt = slice.lastIndexOf(' ');\n  }\n  return splitAt;\n}\n\nfunction _findSafeUtf8SplitPoint(textSegment: Buffer): number {\n  let splitAt = textSegment.length;\n  while (splitAt > 0) {\n    const slice = textSegment.subarray(0, splitAt);\n    // check if the slice is a valid utf8 string\n    if (slice.toString('utf-8').endsWith('�')) {\n      splitAt--;\n      continue;\n    }\n    return splitAt;\n  }\n  return splitAt;\n}\n\nfunction _adjustSplitPointForXmlEntity(text: Buffer, splitAt: number): number {\n  let ampersandIndex = text.lastIndexOf('&', splitAt - 1);\n  while (ampersandIndex !== -1) {\n    const semicolonIndex = text.indexOf(';', ampersandIndex);\n    if (semicolonIndex !== -1 && semicolonIndex < splitAt) {\n      break; // Found a terminated entity\n    }\n    // Ampersand is not terminated before split_at\n    splitAt = ampersandIndex;\n    ampersandIndex = text.lastIndexOf('&', splitAt - 1);\n  }\n  return splitAt;\n}\n\nexport function* splitTextByByteLength(text: string | Buffer, byteLength: number): Generator<Buffer> {\n  let buffer = Buffer.isBuffer(text) ? text : Buffer.from(text, 'utf-8');\n\n  if (byteLength <= 0) {\n    throw new ValueError(\"byteLength must be greater than 0\");\n  }\n\n  while (buffer.length > byteLength) {\n    let splitAt = _findLastNewlineOrSpaceWithinLimit(buffer, byteLength);\n\n    if (splitAt < 0) {\n      splitAt = _findSafeUtf8SplitPoint(buffer.subarray(0, byteLength));\n    }\n\n    splitAt = _adjustSplitPointForXmlEntity(buffer, splitAt);\n\n    if (splitAt <= 0) {\n      throw new ValueError(\n        \"Maximum byte length is too small or \"\n        + \"invalid text structure near '&' or invalid UTF-8\"\n      );\n    }\n\n    let chunk = buffer.subarray(0, splitAt);\n    const chunkString = chunk.toString('utf-8').trim();\n    if (chunkString) {\n      yield Buffer.from(chunkString, 'utf-8');\n    }\n\n    buffer = buffer.subarray(splitAt);\n  }\n\n  const remainingChunk = buffer.toString('utf-8').trim();\n  if (remainingChunk) {\n    yield Buffer.from(remainingChunk, 'utf-8');\n  }\n}\n\nexport function mkssml(tc: TTSConfig, escapedText: string | Buffer): string {\n  const text = Buffer.isBuffer(escapedText) ? escapedText.toString('utf-8') : escapedText;\n  return (\n    \"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'>\"\n    + `<voice name='${tc.voice}'>`\n    + `<prosody pitch='${tc.pitch}' rate='${tc.rate}' volume='${tc.volume}'>`\n    + `${text}`\n    + \"</prosody>\"\n    + \"</voice>\"\n    + \"</speak>\"\n  );\n}\n\nexport function dateToString(): string {\n  return new Date().toUTCString().replace(\"GMT\", \"GMT+0000 (Coordinated Universal Time)\");\n}\n\nexport function ssmlHeadersPlusData(requestId: string, timestamp: string, ssml: string): string {\n  return (\n    `X-RequestId:${requestId}\\r\\n`\n    + \"Content-Type:application/ssml+xml\\r\\n\"\n    + `X-Timestamp:${timestamp}Z\\r\\n`  // This is not a mistake, Microsoft Edge bug.\n    + \"Path:ssml\\r\\n\\r\\n\"\n    + `${ssml}`\n  );\n}\n\nexport function calcMaxMesgSize(ttsConfig: TTSConfig): number {\n  const websocketMaxSize = 2 ** 16;\n  const overheadPerMessage = ssmlHeadersPlusData(\n    connectId(),\n    dateToString(),\n    mkssml(ttsConfig, \"\"),\n  ).length + 50; // margin of error\n  return websocketMaxSize - overheadPerMessage;\n}\n\nexport { escape };\nexport function unescape(text: string): string {\n  return text.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n} ","import { ValueError } from \"./exceptions\";\n\nexport interface ITTSConfig {\n  voice: string;\n  rate: string;\n  volume: string;\n  pitch: string;\n}\n\nexport class TTSConfig implements ITTSConfig {\n  public voice: string;\n  public rate: string;\n  public volume: string;\n  public pitch: string;\n\n  constructor({\n    voice,\n    rate = \"+0%\",\n    volume = \"+0%\",\n    pitch = \"+0Hz\",\n  }: {\n    voice: string,\n    rate?: string,\n    volume?: string,\n    pitch?: string,\n  }) {\n    this.voice = voice;\n    this.rate = rate;\n    this.volume = volume;\n    this.pitch = pitch;\n\n    this.validate();\n  }\n\n  private validate() {\n    // Voice validation and transformation\n    const match = /^([a-z]{2,})-([A-Z]{2,})-(.+Neural)$/.exec(this.voice);\n    if (match) {\n      let [, lang, region, name] = match;\n      if (name.includes('-')) {\n        const parts = name.split('-');\n        region += `-${parts[0]}`;\n        name = parts[1];\n      }\n      this.voice = `Microsoft Server Speech Text to Speech Voice (${lang}-${region}, ${name})`;\n    }\n\n    TTSConfig.validateStringParam(\n      \"voice\",\n      this.voice,\n      /^Microsoft Server Speech Text to Speech Voice \\(.+,.+\\)$/\n    );\n    TTSConfig.validateStringParam(\"rate\", this.rate, /^[+-]\\d+%$/);\n    TTSConfig.validateStringParam(\"volume\", this.volume, /^[+-]\\d+%$/);\n    TTSConfig.validateStringParam(\"pitch\", this.pitch, /^[+-]\\d+Hz$/);\n  }\n\n  private static validateStringParam(paramName: string, paramValue: string, pattern: RegExp) {\n    if (typeof paramValue !== 'string') {\n      throw new TypeError(`${paramName} must be a string`);\n    }\n    if (!pattern.test(paramValue)) {\n      throw new ValueError(`Invalid ${paramName} '${paramValue}'.`);\n    }\n  }\n} ","export const BASE_URL = \"speech.platform.bing.com/consumer/speech/synthesize/readaloud\";\nexport const TRUSTED_CLIENT_TOKEN = \"6A5AA1D4EAFF4E9FB37E23D68491D6F4\";\n\nexport const WSS_URL = `wss://${BASE_URL}/edge/v1?TrustedClientToken=${TRUSTED_CLIENT_TOKEN}`;\nexport const VOICE_LIST_URL = `https://${BASE_URL}/voices/list?trustedclienttoken=${TRUSTED_CLIENT_TOKEN}`;\n\nexport const DEFAULT_VOICE = \"en-US-EmmaMultilingualNeural\";\n\nexport const CHROMIUM_FULL_VERSION = \"130.0.2849.68\";\nexport const CHROMIUM_MAJOR_VERSION = CHROMIUM_FULL_VERSION.split(\".\")[0];\nexport const SEC_MS_GEC_VERSION = `1-${CHROMIUM_FULL_VERSION}`;\n\nexport const BASE_HEADERS = {\n  \"User-Agent\": `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${CHROMIUM_MAJOR_VERSION}.0.0.0 Safari/537.36 Edg/${CHROMIUM_MAJOR_VERSION}.0.0.0`,\n  \"Accept-Encoding\": \"gzip, deflate, br\",\n  \"Accept-Language\": \"en-US,en;q=0.9\",\n};\n\nexport const WSS_HEADERS = {\n  ...BASE_HEADERS,\n  \"Pragma\": \"no-cache\",\n  \"Cache-Control\": \"no-cache\",\n  \"Origin\": \"chrome-extension://jdiccldimpdaibmpdkjnbmckianbfold\",\n};\n\nexport const VOICE_HEADERS = {\n  ...BASE_HEADERS,\n  \"Authority\": \"speech.platform.bing.com\",\n  \"Sec-CH-UA\": `\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"${CHROMIUM_MAJOR_VERSION}\", \"Chromium\";v=\"${CHROMIUM_MAJOR_VERSION}\"`,\n  \"Sec-CH-UA-Mobile\": \"?0\",\n  \"Accept\": \"*/*\",\n  \"Sec-Fetch-Site\": \"none\",\n  \"Sec-Fetch-Mode\": \"cors\",\n  \"Sec-Fetch-Dest\": \"empty\",\n}; ","import { createHash } from 'crypto';\nimport { TRUSTED_CLIENT_TOKEN } from './constants';\nimport { SkewAdjustmentError } from \"./exceptions\";\nimport { AxiosError } from \"axios\";\n\nconst WIN_EPOCH = 11644473600;\nconst S_TO_NS = 1e9;\n\nexport class DRM {\n  private static clockSkewSeconds = 0.0;\n\n  static adjClockSkewSeconds(skewSeconds: number) {\n    DRM.clockSkewSeconds += skewSeconds;\n  }\n\n  static getUnixTimestamp(): number {\n    return Date.now() / 1000 + DRM.clockSkewSeconds;\n  }\n\n  static parseRfc2616Date(date: string): number | null {\n    try {\n      // The python version uses strptime with %Z, but it mentions it's not quite right.\n      // JS's Date parsing is generally good with RFC 2616 dates.\n      // And since it's UTC, it should be fine.\n      return new Date(date).getTime() / 1000;\n    } catch (e) {\n      return null;\n    }\n  }\n\n  static handleClientResponseError(e: AxiosError) {\n    if (!e.response || !e.response.headers) {\n      throw new SkewAdjustmentError(\"No server date in headers.\");\n    }\n    const serverDate = e.response.headers[\"date\"];\n    if (!serverDate || typeof serverDate !== 'string') {\n      throw new SkewAdjustmentError(\"No server date in headers.\");\n    }\n    const serverDateParsed = DRM.parseRfc2616Date(serverDate);\n    if (serverDateParsed === null) {\n      throw new SkewAdjustmentError(`Failed to parse server date: ${serverDate}`);\n    }\n    const clientDate = DRM.getUnixTimestamp();\n    DRM.adjClockSkewSeconds(serverDateParsed - clientDate);\n  }\n\n  static generateSecMsGec(): string {\n    let ticks = DRM.getUnixTimestamp();\n    ticks += WIN_EPOCH;\n    ticks -= ticks % 300;\n    ticks *= S_TO_NS / 100;\n\n    const strToHash = `${ticks.toFixed(0)}${TRUSTED_CLIENT_TOKEN}`;\n    return createHash('sha256').update(strToHash, 'ascii').digest('hex').toUpperCase();\n  }\n} ","import {\n  calcMaxMesgSize,\n  connectId,\n  dateToString,\n  escape,\n  getHeadersAndDataFromBinary,\n  getHeadersAndDataFromText,\n  mkssml,\n  removeIncompatibleCharacters,\n  splitTextByByteLength,\n  ssmlHeadersPlusData,\n  unescape\n} from './utils';\nimport {\n  NoAudioReceived,\n  UnexpectedResponse,\n  UnknownResponse,\n  WebSocketError\n} from \"./exceptions\";\nimport { TTSConfig } from './tts_config';\nimport { CommunicateState, TTSChunk } from './types';\nimport WebSocket from 'ws';\nimport { DEFAULT_VOICE, WSS_URL, WSS_HEADERS, SEC_MS_GEC_VERSION } from './constants';\nimport { DRM } from './drm';\nimport { AxiosError } from 'axios';\nimport { Agent } from 'https';\nimport { HttpsProxyAgent } from 'https-proxy-agent';\n\n/**\n * Configuration options for the Communicate class.\n */\nexport interface CommunicateOptions {\n  /** Voice to use for synthesis (e.g., \"en-US-EmmaMultilingualNeural\") */\n  voice?: string;\n  /** Speech rate adjustment (e.g., \"+20%\", \"-10%\") */\n  rate?: string;\n  /** Volume level adjustment (e.g., \"+50%\", \"-25%\") */\n  volume?: string;\n  /** Pitch adjustment in Hz (e.g., \"+5Hz\", \"-10Hz\") */\n  pitch?: string;\n  /** Proxy URL for requests */\n  proxy?: string;\n  /** WebSocket connection timeout in milliseconds */\n  connectionTimeout?: number;\n}\n\n/**\n * Main class for text-to-speech synthesis using Microsoft Edge's online TTS service.\n * \n * @example\n * ```typescript\n * const communicate = new Communicate('Hello, world!', {\n *   voice: 'en-US-EmmaMultilingualNeural',\n * });\n * \n * for await (const chunk of communicate.stream()) {\n *   if (chunk.type === 'audio' && chunk.data) {\n *     // Handle audio data\n *   }\n * }\n * ```\n */\nexport class Communicate {\n  private readonly ttsConfig: TTSConfig;\n  private readonly texts: Generator<Buffer>;\n  private readonly proxy?: string;\n  private readonly connectionTimeout?: number;\n\n  private state: CommunicateState = {\n    partialText: Buffer.from(''),\n    offsetCompensation: 0,\n    lastDurationOffset: 0,\n    streamWasCalled: false,\n  };\n\n  /**\n   * Creates a new Communicate instance for text-to-speech synthesis.\n   * \n   * @param text - The text to synthesize\n   * @param options - Configuration options for synthesis\n   */\n  constructor(text: string, options: CommunicateOptions = {}) {\n    this.ttsConfig = new TTSConfig({\n      voice: options.voice || DEFAULT_VOICE,\n      rate: options.rate,\n      volume: options.volume,\n      pitch: options.pitch,\n    });\n\n    if (typeof text !== 'string') {\n      throw new TypeError('text must be a string');\n    }\n\n    this.texts = splitTextByByteLength(\n      escape(removeIncompatibleCharacters(text)),\n      calcMaxMesgSize(this.ttsConfig),\n    );\n\n    this.proxy = options.proxy;\n    this.connectionTimeout = options.connectionTimeout;\n  }\n\n  private parseMetadata(data: Buffer): TTSChunk {\n    const metadata = JSON.parse(data.toString('utf-8'));\n    for (const metaObj of metadata['Metadata']) {\n      const metaType = metaObj['Type'];\n      if (metaType === 'WordBoundary') {\n        const currentOffset = metaObj['Data']['Offset'] + this.state.offsetCompensation;\n        const currentDuration = metaObj['Data']['Duration'];\n        return {\n          type: metaType,\n          offset: currentOffset,\n          duration: currentDuration,\n          text: unescape(metaObj['Data']['text']['Text']),\n        };\n      }\n      if (metaType === 'SessionEnd') {\n        continue;\n      }\n      throw new UnknownResponse(`Unknown metadata type: ${metaType}`);\n    }\n    throw new UnexpectedResponse('No WordBoundary metadata found');\n  }\n\n  private async * _stream(): AsyncGenerator<TTSChunk, void, unknown> {\n    const url = `${WSS_URL}&Sec-MS-GEC=${DRM.generateSecMsGec()}&Sec-MS-GEC-Version=${SEC_MS_GEC_VERSION}&ConnectionId=${connectId()}`;\n\n    let agent: Agent | undefined;\n    if (this.proxy) {\n      agent = new HttpsProxyAgent(this.proxy);\n    }\n\n    const websocket = new WebSocket(url, {\n      headers: WSS_HEADERS,\n      timeout: this.connectionTimeout,\n      agent: agent,\n    });\n\n    const messageQueue: (TTSChunk | Error | 'close')[] = [];\n    let resolveMessage: (() => void) | null = null;\n\n    websocket.on('message', (message: Buffer, isBinary: boolean) => {\n      if (!isBinary) {\n        // text message\n        const [headers, data] = getHeadersAndDataFromText(message);\n\n        const path = headers['Path'];\n        if (path === 'audio.metadata') {\n          try {\n            const parsedMetadata = this.parseMetadata(data);\n            this.state.lastDurationOffset = parsedMetadata.offset! + parsedMetadata.duration!;\n            messageQueue.push(parsedMetadata);\n          } catch (e) {\n            messageQueue.push(e as Error);\n          }\n        } else if (path === 'turn.end') {\n          this.state.offsetCompensation = this.state.lastDurationOffset;\n          this.state.offsetCompensation += 8_750_000;\n          websocket.close();\n        } else if (path !== 'response' && path !== 'turn.start') {\n          messageQueue.push(new UnknownResponse(`Unknown path received: ${path}`));\n        }\n      } else {\n        // binary message\n        if (message.length < 2) {\n          messageQueue.push(new UnexpectedResponse('We received a binary message, but it is missing the header length.'));\n        } else {\n          const headerLength = message.readUInt16BE(0);\n          if (headerLength > message.length) {\n            messageQueue.push(new UnexpectedResponse('The header length is greater than the length of the data.'));\n          } else {\n            const [headers, data] = getHeadersAndDataFromBinary(message);\n\n            if (headers['Path'] !== 'audio') {\n              messageQueue.push(new UnexpectedResponse('Received binary message, but the path is not audio.'));\n            } else {\n              const contentType = headers['Content-Type'];\n              if (contentType !== 'audio/mpeg') {\n                if (data.length > 0) {\n                  messageQueue.push(new UnexpectedResponse('Received binary message, but with an unexpected Content-Type.'));\n                }\n              } else if (data.length === 0) {\n                messageQueue.push(new UnexpectedResponse('Received binary message, but it is missing the audio data.'));\n              } else {\n                messageQueue.push({ type: 'audio', data: data });\n              }\n            }\n          }\n        }\n      }\n      if (resolveMessage) resolveMessage();\n    });\n\n    websocket.on('error', (error) => {\n      messageQueue.push(new WebSocketError(error.message));\n      if (resolveMessage) resolveMessage();\n    });\n\n    websocket.on('close', () => {\n      messageQueue.push('close');\n      if (resolveMessage) resolveMessage();\n    });\n\n    await new Promise<void>(resolve => websocket.on('open', resolve));\n\n    websocket.send(\n      `X-Timestamp:${dateToString()}\\r\\n`\n      + 'Content-Type:application/json; charset=utf-8\\r\\n'\n      + 'Path:speech.config\\r\\n\\r\\n'\n      + '{\"context\":{\"synthesis\":{\"audio\":{\"metadataoptions\":{'\n      + '\"sentenceBoundaryEnabled\":\"false\",\"wordBoundaryEnabled\":\"true\"},'\n      + '\"outputFormat\":\"audio-24khz-48kbitrate-mono-mp3\"'\n      + '}}}}\\r\\n'\n    );\n\n    websocket.send(\n      ssmlHeadersPlusData(\n        connectId(),\n        dateToString(),\n        mkssml(this.ttsConfig, this.state.partialText),\n      )\n    );\n\n    let audioWasReceived = false;\n    while (true) {\n      if (messageQueue.length > 0) {\n        const message = messageQueue.shift()!;\n        if (message === 'close') {\n          if (!audioWasReceived) {\n            throw new NoAudioReceived('No audio was received.');\n          }\n          break;\n        } else if (message instanceof Error) {\n          throw message;\n        } else {\n          if (message.type === 'audio') audioWasReceived = true;\n          yield message;\n        }\n      } else {\n        await new Promise<void>(resolve => { resolveMessage = resolve; });\n      }\n    }\n  }\n\n  /**\n   * Streams text-to-speech synthesis results.\n   * \n   * Returns an async generator that yields audio chunks and word boundary events.\n   * Can only be called once per Communicate instance.\n   * \n   * @yields TTSChunk - Audio data or word boundary information\n   * @throws {Error} If called more than once\n   * @throws {NoAudioReceived} If no audio data is received\n   * @throws {WebSocketError} If WebSocket connection fails\n   * \n   * @example\n   * ```typescript\n   * for await (const chunk of communicate.stream()) {\n   *   if (chunk.type === 'audio') {\n   *     // Process audio data\n   *   } else if (chunk.type === 'WordBoundary') {\n   *     // Process subtitle timing\n   *   }\n   * }\n   * ```\n   */\n  async * stream(): AsyncGenerator<TTSChunk, void, unknown> {\n    if (this.state.streamWasCalled) {\n      throw new Error('stream can only be called once.');\n    }\n    this.state.streamWasCalled = true;\n\n    for (const partialText of this.texts) {\n      this.state.partialText = partialText;\n      try {\n        for await (const message of this._stream()) {\n          yield message;\n        }\n      } catch (e) {\n        if (e instanceof AxiosError && e.response?.status === 403) {\n          DRM.handleClientResponseError(e);\n          for await (const message of this._stream()) {\n            yield message;\n          }\n        } else {\n          throw e;\n        }\n      }\n    }\n  }\n} ","import { TTSChunk } from \"./types\";\nimport { ValueError } from \"./exceptions\";\n\ninterface Cue {\n  index: number;\n  start: number; // in seconds\n  end: number; // in seconds\n  content: string;\n}\n\nfunction formatTime(seconds: number): string {\n  const h = Math.floor(seconds / 3600);\n  const m = Math.floor((seconds % 3600) / 60);\n  const s = Math.floor(seconds % 60);\n  const ms = Math.round((seconds - Math.floor(seconds)) * 1000);\n\n  const pad = (num: number, size = 2) => num.toString().padStart(size, '0');\n\n  return `${pad(h)}:${pad(m)}:${pad(s)},${pad(ms, 3)}`;\n}\n\n/**\n * Utility class for generating SRT subtitles from WordBoundary events.\n * \n * @example\n * ```typescript\n * const subMaker = new SubMaker();\n * \n * for await (const chunk of communicate.stream()) {\n *   if (chunk.type === 'WordBoundary') {\n *     subMaker.feed(chunk);\n *   }\n * }\n * \n * const srt = subMaker.getSrt();\n * ```\n */\nexport class SubMaker {\n  private cues: Cue[] = [];\n\n  /**\n   * Adds a WordBoundary chunk to the subtitle maker.\n   * \n   * @param msg - Must be a WordBoundary type chunk with offset, duration, and text\n   * @throws {ValueError} If chunk is not a WordBoundary with required fields\n   */\n  feed(msg: TTSChunk): void {\n    if (msg.type !== 'WordBoundary' || msg.offset === undefined || msg.duration === undefined || msg.text === undefined) {\n      throw new ValueError(\"Invalid message type, expected 'WordBoundary' with offset, duration and text\");\n    }\n\n    // offset and duration are in 100-nanosecond intervals.\n    // srt timestamps are in seconds. 1s = 10^7 * 100ns\n    const start = msg.offset / 1e7;\n    const end = (msg.offset + msg.duration) / 1e7;\n\n    this.cues.push({\n      index: this.cues.length + 1,\n      start: start,\n      end: end,\n      content: msg.text,\n    });\n  }\n\n  mergeCues(words: number): void {\n    if (words <= 0) {\n      throw new ValueError(\"Invalid number of words to merge, expected > 0\");\n    }\n    if (this.cues.length === 0) {\n      return;\n    }\n\n    const newCues: Cue[] = [];\n    let currentCue: Cue = this.cues[0];\n\n    for (const cue of this.cues.slice(1)) {\n      if (currentCue.content.split(' ').length < words) {\n        currentCue = {\n          ...currentCue,\n          end: cue.end,\n          content: `${currentCue.content} ${cue.content}`,\n        };\n      } else {\n        newCues.push(currentCue);\n        currentCue = cue;\n      }\n    }\n    newCues.push(currentCue);\n\n    // re-index\n    this.cues = newCues.map((cue, i) => ({ ...cue, index: i + 1 }));\n  }\n\n  /**\n   * Returns the subtitles in SRT format.\n   * \n   * @returns SRT formatted subtitles\n   */\n  getSrt(): string {\n    return this.cues.map(cue => {\n      return `${cue.index}\\r\\n${formatTime(cue.start)} --> ${formatTime(cue.end)}\\r\\n${cue.content}\\r\\n`;\n    }).join('\\r\\n');\n  }\n\n  toString(): string {\n    return this.getSrt();\n  }\n} ","import axios, { AxiosError, AxiosProxyConfig } from 'axios';\nimport { SEC_MS_GEC_VERSION, VOICE_HEADERS, VOICE_LIST_URL } from './constants';\nimport { DRM } from './drm';\nimport { Voice, VoicesManagerFind, VoicesManagerVoice } from './types';\n\nfunction buildProxyConfig(proxy: string): AxiosProxyConfig | false {\n  try {\n    const proxyUrl = new URL(proxy);\n    return {\n      host: proxyUrl.hostname,\n      port: parseInt(proxyUrl.port),\n      protocol: proxyUrl.protocol,\n    };\n  } catch (e) {\n    // if proxy is not a valid URL, just ignore it.\n    return false;\n  }\n}\n\nasync function _listVoices(proxy?: string): Promise<Voice[]> {\n  const url = `${VOICE_LIST_URL}&Sec-MS-GEC=${DRM.generateSecMsGec()}&Sec-MS-GEC-Version=${SEC_MS_GEC_VERSION}`;\n  const response = await axios.get<Voice[]>(url, {\n    headers: VOICE_HEADERS,\n    proxy: proxy ? buildProxyConfig(proxy) : false,\n  });\n\n  const data = response.data;\n\n  for (const voice of data) {\n    voice.VoiceTag.ContentCategories = voice.VoiceTag.ContentCategories.map(c => c.trim() as any);\n    voice.VoiceTag.VoicePersonalities = voice.VoiceTag.VoicePersonalities.map(p => p.trim() as any);\n  }\n\n  return data;\n}\n\n/**\n * Fetches all available voices from the Microsoft Edge TTS service.\n * \n * @param proxy - Optional proxy URL for the request\n * @returns Promise resolving to array of available voices\n */\nexport async function listVoices(proxy?: string): Promise<Voice[]> {\n  try {\n    return await _listVoices(proxy);\n  } catch (e) {\n    if (e instanceof AxiosError && e.response?.status === 403) {\n      DRM.handleClientResponseError(e);\n      return await _listVoices(proxy);\n    }\n    throw e;\n  }\n}\n\n/**\n * Utility class for finding and filtering available voices.\n * \n * @example\n * ```typescript\n * const voicesManager = await VoicesManager.create();\n * const englishVoices = voicesManager.find({ Language: 'en' });\n * ```\n */\nexport class VoicesManager {\n  private voices: VoicesManagerVoice[] = [];\n  private calledCreate = false;\n\n  /**\n   * Creates a new VoicesManager instance.\n   * \n   * @param customVoices - Optional custom voice list instead of fetching from API\n   * @param proxy - Optional proxy URL for API requests\n   * @returns Promise resolving to VoicesManager instance\n   */\n  public static async create(customVoices?: Voice[], proxy?: string): Promise<VoicesManager> {\n    const manager = new VoicesManager();\n    const voices = customVoices ?? await listVoices(proxy);\n    manager.voices = voices.map(voice => ({\n      ...voice,\n      Language: voice.Locale.split('-')[0],\n    }));\n    manager.calledCreate = true;\n    return manager;\n  }\n\n  /**\n   * Finds voices matching the specified criteria.\n   * \n   * @param filter - Filter criteria for voice selection\n   * @returns Array of voices matching the filter\n   * @throws {Error} If called before create()\n   */\n  public find(filter: VoicesManagerFind): VoicesManagerVoice[] {\n    if (!this.calledCreate) {\n      throw new Error('VoicesManager.find() called before VoicesManager.create()');\n    }\n\n    return this.voices.filter(voice => {\n      return Object.entries(filter).every(([key, value]) => {\n        return voice[key as keyof VoicesManagerFind] === value;\n      });\n    });\n  }\n} ","import { Communicate } from './communicate';\nimport { SubMaker } from './submaker';\n\n/**\n * Options for controlling the voice prosody (rate, pitch, volume).\n */\nexport interface ProsodyOptions {\n  /**\n   * The speaking rate of the voice.\n   * Examples: \"+10.00%\", \"-20.00%\"\n   */\n  rate?: string;\n  /**\n   * The speaking volume of the voice.\n   * Examples: \"+15.00%\", \"-10.00%\"\n   */\n  volume?: string;\n  /**\n   * The speaking pitch of the voice.\n   * Examples: \"+20Hz\", \"-10Hz\"\n   */\n  pitch?: string;\n}\n\n/**\n * Represents a single word boundary with its timing and text.\n * The API provides timing in 100-nanosecond units.\n */\nexport interface WordBoundary {\n  /**\n   * The offset from the beginning of the audio stream in 100-nanosecond units.\n   */\n  offset: number;\n  /**\n   * The duration of the word in 100-nanosecond units.\n   */\n  duration: number;\n  /**\n   * The text of the spoken word.\n   */\n  text: string;\n}\n\n/**\n * The final result of the synthesis process.\n */\nexport interface SynthesisResult {\n  /**\n   * The generated audio as a Blob, which can be used in an <audio> element.\n   */\n  audio: Blob;\n  /**\n   * An array of word boundaries containing timing and text for creating subtitles.\n   */\n  subtitle: WordBoundary[];\n}\n\n/**\n * Simple Edge TTS class that provides the same API as the standalone implementation\n * but uses the robust infrastructure of the modular project.\n */\nexport class EdgeTTS {\n  public text: string;\n  public voice: string;\n  public rate: string;\n  public volume: string;\n  public pitch: string;\n\n  /**\n   * @param text The text to be synthesized.\n   * @param voice The voice to use for synthesis.\n   * @param options Prosody options (rate, volume, pitch).\n   */\n  constructor(\n    text: string,\n    voice = \"Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)\",\n    options: ProsodyOptions = {}\n  ) {\n    this.text = text;\n    this.voice = voice;\n    this.rate = options.rate || \"+0%\";\n    this.volume = options.volume || \"+0%\";\n    this.pitch = options.pitch || \"+0Hz\";\n  }\n\n  /**\n   * Initiates the synthesis process.\n   * @returns A promise that resolves with the synthesized audio and subtitle data.\n   */\n  public async synthesize(): Promise<SynthesisResult> {\n    const communicate = new Communicate(this.text, {\n      voice: this.voice,\n      rate: this.rate,\n      volume: this.volume,\n      pitch: this.pitch,\n    });\n\n    const audioChunks: Buffer[] = [];\n    const wordBoundaries: WordBoundary[] = [];\n\n    for await (const chunk of communicate.stream()) {\n      if (chunk.type === 'audio' && chunk.data) {\n        audioChunks.push(chunk.data);\n      } else if (chunk.type === 'WordBoundary' && chunk.offset !== undefined && chunk.duration !== undefined && chunk.text !== undefined) {\n        wordBoundaries.push({\n          offset: chunk.offset,\n          duration: chunk.duration,\n          text: chunk.text,\n        });\n      }\n    }\n\n    // Convert Buffer array to Blob\n    const audioBuffer = Buffer.concat(audioChunks);\n    const audioBlob = new Blob([audioBuffer], { type: \"audio/mpeg\" });\n\n    return {\n      audio: audioBlob,\n      subtitle: wordBoundaries,\n    };\n  }\n}\n\n// ==================================================================================\n// Subtitle Generation Utilities (from code (54).ts)\n// ==================================================================================\n\n/**\n * Formats a time value from 100-nanosecond units into a VTT or SRT timestamp string.\n * @param timeIn100ns The time value in 100-nanosecond units.\n * @param format The subtitle format, which determines the decimal separator.\n * @returns A formatted timestamp string (e.g., \"00:01:23.456\").\n */\nfunction formatTimestamp(timeIn100ns: number, format: 'vtt' | 'srt'): string {\n  const totalSeconds = Math.floor(timeIn100ns / 10000000);\n  const hours = Math.floor(totalSeconds / 3600);\n  const minutes = Math.floor((totalSeconds % 3600) / 60);\n  const seconds = totalSeconds % 60;\n  const milliseconds = Math.floor((timeIn100ns % 10000000) / 10000);\n  const separator = format === 'vtt' ? '.' : ',';\n  return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}${separator}${padNumber(milliseconds, 3)}`;\n}\n\n/**\n * Pads a number with leading zeros to a specified length.\n * @param num The number to pad.\n * @param length The desired length of the string.\n * @returns The padded number as a string.\n */\nfunction padNumber(num: number, length = 2): string {\n  return num.toString().padStart(length, '0');\n}\n\n/**\n * Creates a subtitle file content in VTT (WebVTT) format.\n * @param wordBoundaries The array of word boundary data.\n * @returns A string containing the VTT formatted subtitles.\n */\nexport function createVTT(wordBoundaries: WordBoundary[]): string {\n  let vttContent = \"WEBVTT\\n\\n\";\n  wordBoundaries.forEach((word, index) => {\n    const startTime = formatTimestamp(word.offset, 'vtt');\n    const endTime = formatTimestamp(word.offset + word.duration, 'vtt');\n    vttContent += `${index + 1}\\n`;\n    vttContent += `${startTime} --> ${endTime}\\n`;\n    vttContent += `${word.text}\\n\\n`;\n  });\n  return vttContent;\n}\n\n/**\n * Creates a subtitle file content in SRT (SubRip) format.\n * @param wordBoundaries The array of word boundary data.\n * @returns A string containing the SRT formatted subtitles.\n */\nexport function createSRT(wordBoundaries: WordBoundary[]): string {\n  let srtContent = \"\";\n  wordBoundaries.forEach((word, index) => {\n    const startTime = formatTimestamp(word.offset, 'srt');\n    const endTime = formatTimestamp(word.offset + word.duration, 'srt');\n    srtContent += `${index + 1}\\n`;\n    srtContent += `${startTime} --> ${endTime}\\n`;\n    srtContent += `${word.text}\\n\\n`;\n  });\n  return srtContent;\n} "]}