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

Unity通过Azure Function调用Azure文本转语音获取MP3遇格式错误

问题解决:Unity调用Azure TTS Function返回音频格式不支持错误

核心原因

你的Azure Function代码没有返回有效的MP3音频数据,也未设置正确的HTTP响应头,导致Unity接收到的内容为空或不符合格式的数据流,触发FMOD的格式不支持错误。

修改Azure Function代码

以下是修复后的完整代码,重点补充了音频数据返回和响应头设置:

[FunctionName("HTTP_Auth_TextToSpeech")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    string text = req.Query["text"];
    string voiceName = req.Query["voiceName"];
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    text = text ?? data?.text;
    voiceName = voiceName ?? data?.voiceName;

    // 校验必要参数
    if (string.IsNullOrEmpty(text))
    {
        return new BadRequestObjectResult("Missing 'text' parameter");
    }

    try
    {
        var speechConfig = SpeechConfig.FromSubscription("<tts key>", "<region>");
        speechConfig.SpeechSynthesisVoiceName = voiceName;

        using (SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig))
        {
            var result = await synthesizer.SpeakTextAsync(text);

            // 检查合成是否成功
            if (result.Reason == ResultReason.SynthesizingAudioCompleted)
            {
                // 返回MP3字节数组,设置正确的Content-Type
                return new FileContentResult(result.AudioData, "audio/mpeg");
            }
            else
            {
                log.LogError($"TTS合成失败: {result.Reason}");
                return new StatusCodeResult(StatusCodes.Status500InternalServerError);
            }
        }
    }
    catch (Exception ex)
    {
        log.LogError(ex, "TTS处理异常");
        return new StatusCodeResult(StatusCodes.Status500InternalServerError);
    }
}

关键修改点:

  • 将返回类型从Task<dynamic>改为Task<IActionResult>,便于标准化HTTP响应
  • 添加参数校验,确保text参数存在
  • 使用await替代.Result避免同步阻塞
  • 检查语音合成结果的Reason,确认音频生成成功
  • 通过FileContentResult返回音频字节数组,并设置Content-Type为audio/mpeg
  • 添加异常捕获和错误日志,便于排查问题

Unity端优化建议

  1. URL参数编码:对text参数进行URL编码,避免特殊字符(如空格、中文)导致请求异常:
string encodedText = UnityWebRequest.EscapeURL(text);
string url = $"https://<azurefunction_url>?text={encodedText}&voiceName={voiceName}";
  1. 确认AudioType.MPEG与返回的音频格式匹配(Azure TTS默认生成MP3,此设置正确)
  2. 增加错误日志的详细信息,便于排查:
if (request.result != UnityWebRequest.Result.Success)
{
    Debug.LogError($"请求错误: {request.error}, 响应码: {request.responseCode}");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:34:54