You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure文本转语音API 4429限流错误排查及请求优化咨询

Azure Text to Speech API 4429限流问题解决与高速请求优化

问题分析

你遇到的4429错误是Azure Speech服务的并发请求超限限流,即使采用串行请求仍触发错误,核心原因包括:

  • 资源未完全释放:每次循环创建新的SpeechSynthesizer,异步close()操作可能导致连接未及时回收,被服务端判定为并发连接占用配额。
  • 定价层默认配额限制:标准层仍有默认并发请求上限(如S0层默认并发数为20,具体依区域/订阅略有差异),你的请求频率或连接数仍触达阈值。
  • SDK使用冗余:重复创建SpeechConfig和合成器实例,增加服务端连接压力。

解决方案

1. 优化资源复用,减少连接开销

避免在循环内重复创建配置和合成器实例,复用这些对象可大幅降低连接建立/销毁的开销:

import 'dotenv/config'
import sdk from 'microsoft-cognitiveservices-speech-sdk'
import fs from 'fs'
import { parse } from 'csv-parse/sync'
import talk from '@termsurf/talk'

const terms = parse(
  fs.readFileSync(`tibetan.syllable.csv`, `utf-8`),
  { columns: true },
)

const TERMS = terms.reduce((m: any, x: any) => {
  if (x.pronunciation.trim().match(/[\s\/]|a~/)) return m
  m[x.word] = {
    talk: x.pronunciation.trim(),
    ipa: talk.default.talk.toIPA(x.pronunciation.trim()),
  }
  return m
}, {})

// 将SpeechConfig移到循环外,全局复用
const speechConfig = sdk.SpeechConfig.fromSubscription(
  String(process.env.SPEECH_KEY),
  String(process.env.SPEECH_REGION),
)

call()

async function call() {
  // 复用单个SpeechSynthesizer实例,循环结束后统一关闭
  const synthesizer = new sdk.SpeechSynthesizer(speechConfig)

  for (const term in TERMS) {
    await new Promise(res => setTimeout(res, 500))
    const { talk, ipa } = TERMS[term]
    
    // 动态切换语音名称,无需重建配置
    synthesizer.speechSynthesisVoiceName = talk.match(/c/i)
      ? 'en-US-AndrewMultilingualNeural'
      : 'hi-IN-KunalNeural'

    const path = `tmp/tibetan/kunal/${term}-${talk}.mp3`
    if (fs.existsSync(path)) {
      continue
    }

    console.log(term, TERMS[term])

    const ssml = `<speak xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="http://www.w3.org/2001/mstts" xmlns:emo="http://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="en-US">
  <voice name="${synthesizer.speechSynthesisVoiceName}">
    <prosody rate="slow">
      <phoneme alphabet="ipa" ph="${ipa}">${talk}</phoneme>
    </prosody>
  </voice>
</speak>`

    await new Promise((res, rej) => {
      synthesizer.speakSsmlAsync(
        ssml,
        function (result) {
          if (result.errorDetails) {
            console.error(result.errorDetails)
          } else {
            fs.writeFileSync(path, new Uint8Array(result.audioData))
          }
          res(undefined)
        },
        function (err) {
          console.trace(err)
          rej(err)
        },
      )
    })
  }
  // 循环结束后统一关闭合成器
  synthesizer.close()
}

2. 实现指数退避重试策略

遇到4429限流错误时,通过指数退避自动重试,避免持续触发限流:

// 封装带重试的合成函数
async function synthesizeWithRetry(synthesizer, ssml, maxRetries = 5) {
  let retries = 0
  while (retries < maxRetries) {
    try {
      return await new Promise((res, rej) => {
        synthesizer.speakSsmlAsync(
          ssml,
          result => {
            if (result.errorDetails) {
              // 识别4429限流错误
              if (result.errorDetails.includes('4429')) {
                rej(new Error('Throttled'))
              } else {
                rej(new Error(result.errorDetails))
              }
            } else {
              res(result.audioData)
            }
          },
          rej
        )
      })
    } catch (err) {
      if (err.message === 'Throttled' && retries < maxRetries - 1) {
        retries++
        // 指数退避延迟:1s → 2s → 4s → 8s...
        const delay = Math.pow(2, retries) * 1000
        await new Promise(res => setTimeout(res, delay))
        continue
      }
      throw err
    }
  }
  throw new Error('Max retries exceeded')
}

// 在循环内替换原合成逻辑
const audioData = await synthesizeWithRetry(synthesizer, ssml)
fs.writeFileSync(path, new Uint8Array(audioData))

3. 确认并提升配额

  • 登录Azure门户,进入你的Speech资源,查看使用情况 + 配额页面,确认当前定价层的并发请求上限。
  • 若默认配额无法满足需求,提交支持工单申请提高并发请求配额,说明你的业务场景和需求,微软会根据实际情况调整。

4. 调整请求频率

若串行请求间隔过短(如500ms),服务端可能将连续请求判定为并发压力,可尝试适当延长间隔(如1s),或根据API返回的Retry-After头信息动态调整等待时间。

高速无限制请求核心要点

  • 复用资源:避免重复创建配置和合成器,减少连接开销。
  • 智能重试:针对限流错误实现指数退避,自动恢复请求。
  • 配额扩容:根据业务需求申请更高的并发配额。
  • 状态监控:记录请求成功率和错误类型,及时调整策略。

内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:52:36