我有一个 Azure 机器人,它能够获取 wav 音频文件并使用 Bing Speech API 翻译成文本。我正在尝试将其连接到 Skype。我不知道如何从附件中获取流。我的代码的第一部分找到了 ContentType='audio' ok 的 Skype 附件:
public async Task<string> GetText(IMessageActivity messageActivity)
{
var connector = new ConnectorClient(new Uri(messageActivity.ServiceUrl));
try
{
var skypeAudioAttachment = messageActivity.Attachments?.FirstOrDefault(sa => sa.ContentType.Equals("audio"));
if (skypeAudioAttachment != null)
{
var stream = await GetAudioStream(connector, skypeAudioAttachment);
但后来我尝试使用下面的代码(取自 Microsoft BotBuilder 示例的 Controller\MessagesController.cs 文件:https ://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/intelligence- SpeechToText)来获得一个流:
private static async Task<Stream> GetAudioStream(ConnectorClient connector, Attachment audioAttachment)
{
using (var httpClient = new HttpClient())
{
// The Skype attachment URLs are secured by JwtToken,
// you should set the JwtToken of your bot as the authorization header for the GET request your bot initiates to fetch the image.
// https://github.com/Microsoft/BotBuilder/issues/662
var uri = new Uri(audioAttachment.ContentUrl);
if (uri.Host.EndsWith("skype.com") && uri.Scheme == "https")
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await GetTokenAsync(connector));
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));
}
return await httpClient.GetStreamAsync(uri);
}
}
private static async Task<string> GetTokenAsync(ConnectorClient connector)
{
var credentials = connector.Credentials as MicrosoftAppCredentials;
if (credentials != null)
{
return await credentials.GetTokenAsync();
}
return null;
}
这失败了,我想是因为我无法访问该网址。有没有人举例说明如何获取 Skype 音频流或知道我应该怎么做?
ContentUrl 的格式为:https://smba.trafficmanager.net/apis/v3/attachments/LONG_ID_GOES_HERE/views/original。我从 httpClient.GetStreamAsync 请求返回的错误是“响应状态代码不指示成功:401(未授权)。”
谢谢