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端优化建议
- URL参数编码:对text参数进行URL编码,避免特殊字符(如空格、中文)导致请求异常:
string encodedText = UnityWebRequest.EscapeURL(text); string url = $"https://<azurefunction_url>?text={encodedText}&voiceName={voiceName}";
- 确认
AudioType.MPEG与返回的音频格式匹配(Azure TTS默认生成MP3,此设置正确) - 增加错误日志的详细信息,便于排查:
if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"请求错误: {request.error}, 响应码: {request.responseCode}"); }
内容的提问来源于stack exchange,提问作者vii
相关产品推荐
相关产品推荐

