Azure Bot对接Skype:如何从音频附件获取流用于Bing Speech转文本
嘿,我来帮你搞定Skype音频附件流的获取问题!你已经找到音频附件这步走对了,接下来关键是要通过Skype提供的临时链接去下载音频流,而且还要带上身份验证令牌才行,不然会被拒绝访问。
给你补全并优化后的代码示例,直接就能用:
public async Task<string> GetText(IMessageActivity messageActivity) { var connector = new ConnectorClient(new Uri(messageActivity.ServiceUrl)); try { // 筛选出音频类型的附件 var skypeAudioAttachment = messageActivity.Attachments .FirstOrDefault(a => a.ContentType.StartsWith("audio/")); if (skypeAudioAttachment == null) { return "未检测到音频附件"; } // 获取Skype提供的音频临时访问链接 var audioContentUrl = skypeAudioAttachment.ContentUrl; // 创建HttpClient来下载音频流,记得带上身份令牌 using (var httpClient = new HttpClient()) { // 获取ConnectorClient的访问令牌,用于访问Skype的附件链接 var accessToken = await connector.Credentials.GetTokenAsync(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); // 下载音频流 var audioStream = await httpClient.GetStreamAsync(audioContentUrl); // 把流传给Bing Speech API做转文字,这里假设你有对应的处理方法 var transcribedText = await ConvertAudioToTextWithBing(audioStream, skypeAudioAttachment.ContentType); return transcribedText; } } catch (Exception ex) { return $"处理音频时出现错误:{ex.Message}"; } } // 示例:调用Bing Speech API的方法,你需要根据实际SDK/API调整 private async Task<string> ConvertAudioToTextWithBing(Stream audioStream, string audioContentType) { // 这里替换成你实际调用Bing Speech的逻辑 // 比如使用Microsoft.CognitiveServices.Speech SDK的话,代码大概是这样: var config = SpeechConfig.FromSubscription("你的Bing Speech密钥", "区域"); using var audioInput = AudioConfig.FromStreamInput(audioStream); using var recognizer = new SpeechRecognizer(config, audioContentType, audioInput); var result = await recognizer.RecognizeOnceAsync(); return result.Reason == ResultReason.RecognizedSpeech ? result.Text : "转写失败"; }
这里有几个要重点注意的地方:
- 身份验证:Skype的附件链接是受保护的,必须带上ConnectorClient的令牌才能访问,不然会返回401 Unauthorized错误,这是很多人踩坑的点!
- 音频格式匹配:要把Skype传来的ContentType(比如audio/wav、audio/mpeg)传给Bing Speech API,确保API能正确解析音频格式。
- 资源释放:用using包裹HttpClient和各种SDK客户端,避免内存泄漏。
如果你的Bot用的是较新的Bot Framework版本(比如v4+),ConnectorClient的用法可能稍有不同,但核心逻辑还是一样的:获取附件的ContentUrl,带上令牌下载流,再传给语音转文字服务。
内容的提问来源于stack exchange,提问作者Zelestor
相关产品推荐
相关产品推荐

