如何为.NET Core 2机器人添加语音转文本功能?
没问题!我来帮你把Microsoft Cognitive Services的语音转文本功能集成到你的.NET Core 2 Bot里,结合你提到的那个基础版“Hi there!”机器人示例一步步说明:
1. 安装适配的NuGet包
首先得给项目安装两个关键包,注意要选支持.NET Core 2的版本:
- 在NuGet包管理器中安装
Microsoft.Bot.Builder(推荐v4.6.x系列,这是适配.NET Core 2的稳定版本) - 安装
Microsoft.CognitiveServices.Speech(选v1.15.x及以下版本,新版本不再支持.NET Core 2)
2. 配置语音服务凭证
在项目的appsettings.json里添加你的Azure语音服务密钥和区域信息:
{ "MicrosoftAppId": "", "MicrosoftAppPassword": "", "SpeechServiceKey": "你的Azure语音服务密钥", "SpeechServiceRegion": "你的服务区域,比如eastus" }
3. 修改Bot类,添加语音转文本逻辑
打开你的Bot类(对应基础示例里的EchoBot.cs),先注入配置,再实现语音转文本的核心方法:
注入配置到Bot类
private readonly IConfiguration _configuration; public EchoBot(IConfiguration configuration) { _configuration = configuration; }
实现语音转文本方法
private async Task<string> ConvertSpeechToTextAsync(byte[] speechAudio) { // 初始化语音服务配置 var speechConfig = SpeechConfig.FromSubscription( _configuration["SpeechServiceKey"], _configuration["SpeechServiceRegion"]); // 从内存流加载音频数据 using var audioConfig = AudioConfig.FromWavFileInput(new MemoryStream(speechAudio)); using var recognizer = new SpeechRecognizer(speechConfig, audioConfig); // 执行一次语音识别 var result = await recognizer.RecognizeOnceAsync(); // 根据识别结果返回对应文本 switch (result.Reason) { case ResultReason.RecognizedSpeech: return result.Text; case ResultReason.NoMatch: return $"语音识别失败:{NoMatchDetails.FromResult(result).Reason}"; case ResultReason.Canceled: var cancellation = CancellationDetails.FromResult(result); return $"语音识别被取消:{cancellation.Reason},错误信息:{cancellation.ErrorDetails}"; default: return "无法识别语音内容"; } }
4. 处理用户发送的语音消息
在OnTurnAsync方法里,增加对语音附件的判断和处理逻辑,替换原来的文本消息处理部分:
public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { if (turnContext.Activity.Type == ActivityTypes.Message) { string messageContent = string.Empty; // 检查消息是否包含语音附件(通常是audio/wav格式) var speechAttachment = turnContext.Activity.Attachments?.FirstOrDefault(a => a.ContentType.StartsWith("audio/")); if (speechAttachment != null) { // 下载语音附件的二进制数据 using var httpClient = new HttpClient(); var audioStream = await httpClient.GetStreamAsync(speechAttachment.ContentUrl); using var memoryStream = new MemoryStream(); await audioStream.CopyToAsync(memoryStream); var audioBytes = memoryStream.ToArray(); // 调用语音转文本方法 messageContent = await ConvertSpeechToTextAsync(audioBytes); await turnContext.SendActivityAsync(MessageFactory.Text($"我识别到你说的是:{messageContent}"), cancellationToken); } else { // 保留原来的文本消息处理逻辑 messageContent = turnContext.Activity.Text; var responseText = $"你说的是:{messageContent}"; await turnContext.SendActivityAsync(MessageFactory.Text(responseText, responseText), cancellationToken); } } else { await turnContext.SendActivityAsync(MessageFactory.Text($"收到了{turnContext.Activity.Type}类型的消息"), cancellationToken); } }
几个关键注意点
- 确保你已经在Azure门户创建了语音服务资源,并且密钥和区域配置正确。
- 聊天客户端(比如Web Chat、Teams)发送的语音必须是符合要求的格式:推荐16kHz采样率、16位单声道的WAV文件,否则识别效果会很差甚至失败。
- 如果遇到NuGet包版本冲突,优先保证
Microsoft.Bot.Builder和Microsoft.CognitiveServices.Speech的版本都支持.NET Core 2。
内容的提问来源于stack exchange,提问作者Parvathy Sarat
相关产品推荐
相关产品推荐

