如何将Azure语音服务的转录文本直接发送至其他端点或Azure函数?
可行方案实现
要在浏览器的recognized事件触发前发送转录文本,核心是利用Azure语音SDK的中间转录结果事件,或通过Azure函数作为转发层处理请求,以下是具体实现方式:
1. 监听recognizing事件获取实时中间结果
Azure语音SDK的SpeechRecognizer提供了recognizing事件,该事件会在最终的recognized事件(返回最终转录结果)之前触发,实时返回正在生成的中间转录文本。你可以在这个事件回调里直接将文本发送到目标端点,或者先转发到Azure函数。
浏览器端代码示例
// 初始化语音SDK配置 const speechConfig = SpeechSDK.SpeechConfig.fromSubscription("你的订阅密钥", "你的区域"); const audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput(); const recognizer = new SpeechSDK.SpeechRecognizer(speechConfig, audioConfig); // 监听中间转录结果事件(在最终recognized事件前触发) recognizer.recognizing = (sender, eventArgs) => { if (eventArgs.result.reason === SpeechSDK.ResultReason.RecognizingSpeech) { const interimTranscript = eventArgs.result.text; // 发送文本到目标端点或Azure函数 sendTranscript(interimTranscript); } }; // 可选:监听最终转录结果 recognizer.recognized = (sender, eventArgs) => { if (eventArgs.result.reason === SpeechSDK.ResultReason.RecognizedSpeech) { const finalTranscript = eventArgs.result.text; sendTranscript(finalTranscript); } }; // 发送转录文本的函数 function sendTranscript(text) { // 替换为你的目标端点或Azure函数URL const targetUrl = "https://your-azure-function-url/api/forward-transcript"; fetch(targetUrl, { method: "POST", headers: { "Content-Type": "application/json", // 如果是Azure函数,需要添加函数密钥(若设置了授权) "x-functions-key": "你的Azure函数密钥" }, body: JSON.stringify({ transcript: text }) }) .catch(err => console.error("发送转录文本失败:", err)); } // 启动持续识别 recognizer.startContinuousRecognitionAsync();
2. 用Azure函数作为转发中间层
如果目标端点存在CORS限制、需要额外处理(比如格式转换、缓存、重试),可以用Azure函数作为中间层,接收浏览器发送的转录文本,再转发到目标端点。
Azure函数(C#)示例
using System.Net; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; using System.Text.Json; public class TranscriptForwarder { private readonly ILogger<TranscriptForwarder> _logger; private readonly HttpClient _httpClient; public TranscriptForwarder(ILogger<TranscriptForwarder> logger, HttpClient httpClient) { _logger = logger; _httpClient = httpClient; } [Function("ForwardTranscript")] public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req) { _logger.LogInformation("收到待转发的转录文本"); // 解析浏览器发送的请求体 var requestBody = await new StreamReader(req.Body).ReadToEndAsync(); var transcriptData = JsonSerializer.Deserialize<TranscriptPayload>(requestBody); // 转发到目标端点 var forwardResponse = await _httpClient.PostAsJsonAsync( "https://your-target-endpoint.com/receive-transcript", transcriptData ); // 返回响应给浏览器 var response = req.CreateResponse(forwardResponse.StatusCode); await response.WriteAsJsonAsync(new { Success = forwardResponse.IsSuccessStatusCode }); return response; } // 定义请求体模型 private class TranscriptPayload { public string Transcript { get; set; } } }
关键注意事项
- CORS配置:如果浏览器直接调用目标端点,需要目标端点允许你的前端域名;如果用Azure函数,只需在Azure函数的CORS设置里添加前端域名即可,函数端调用目标端点不受浏览器CORS限制。
- 请求节流:
recognizing事件触发频率很高(通常每秒多次),可以添加节流逻辑(比如每500ms发送一次最新文本),避免请求过载。 - 错误处理:添加请求重试机制,避免因网络波动丢失转录文本;同时可以记录失败的请求,方便后续排查。
内容的提问来源于stack exchange,提问作者Abdullah Nadeem
相关产品推荐
相关产品推荐

