繁体   English   中英

使用Microsoft认知语音+ Websocket的连续语音识别-Xamarin

[英]Continuous Speech Recognition using Microsoft Cognitive Speech + Websocket - Xamarin

我正在尝试使用Xamarin AndroidMicrosoft认知语音麦克风建立连续语音识别 我认为没有Xamarin的库,因此我稍微修改了“ Xamarin.Cognitive.BingSpeech ”库(端点等)以使其正常工作。 我有问题

我想通过以下https://docs.microsoft.com/zh-cn/azure/cognitive-services/speech/api-reference-rest/websocketprotocol教程来连接到Microsoft Web套接字。

我尝试使用基本的HttpClient发送HTTPREQUEST并获得了101交换协议的结果(我想我成功了吗?)。

更新:我的HTTP请求是:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

var request = new HttpWebRequest(uriBuilder.Uri);
request.Headers.Add("Authorization", new System.Net.Http.Headers.AuthenticationHeaderValue(Bearer, AuthClient.Token).ToString());
request.Accept=MimeTypes.Json;
request.Host = SpeechEndpoint.Host;
request.Connection = "Upgrade";
request.Headers.Add("Upgrade", "Websocket");
request.KeepAlive = true;
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = true;
request.Date = DateTime.Now;
request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.CacheIfAvailable);
request.Headers.Add("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ==");
request.Headers.Add("Sec-WebSocket-Version", "13");
request.Headers.Add("Sec-WebSocket-Protocol", "chat, superchat");
request.Headers.Add("X-ConnectionId",xConnectionId = Guid.NewGuid().ToString().ToUpper());

发出HTTPRequest之后,我尝试连接到Websocket,但是我总是得到“无法连接到远程服务器”,而没有任何错误代码或任何其他信息。 (WSS:// XXXXXXXX)。

Uri wsuri = new Uri(AppConfig.BINGWSSURI);
await _socketclient.ConnectAsync(wsuri, CancellationToken.None);
Log.Info("WSOCKETFINISH", _socketclient.State.ToString());

我要实现的第二件事是使用二进制消息将音频从麦克风流传输到Websocket,因此我必须

  1. 从麦克风录制(我正在使用Plugin.AudioRecorder
  2. 切成小块
  3. 使用websocket异步传输小片段

我想要实现的目标:使用带有Microsoft认知语音,听写模式的麦克风进行语音转文本,因此我需要部分结果,而不是等待录制完成。

我认为您想将语音转换为文本。
由于Xamarin.Cognitive.BingSpeech需要您记录语音并将其作为文件或流发送到服务器。 我认为您可以尝试使用Android语音 它还可以将文本转换为语音。 是一个例子。

如果要使用Xamarin.Cognitive.BingSpeech,则可以使用Audio Recorder插件记录语音,并使用BingSpeechApiClient发送到服务器。 例如:

BingSpeechApiClient bingSpeechClient = new BingSpeechApiClient ("My Bing Speech API Subscription Key");
var audioFile = "/a/path/to/my/audio/file/in/WAV/format.wav";
var simpleResult = await bingSpeechClient.SpeechToTextSimple (audioFile);
Or
var simpleResult = await bingSpeechClient.SpeechToTextSimple (stream, <sample rate>, <audio record Task>);

是Xamarin.Cognitive.BingSpeech的示例。

更新:

我总是得到“无法连接到远程服务器”而没有任何错误代码或任何东西。

您在标头中缺少某些值。

  1. X-的ConnectionId
    您需要生成一个UUID并将其添加到标头中。 例如: client.Options.SetRequestHeader("X-ConnectionId", System.Guid.NewGuid().ToString());
  2. 授权
    您需要将订阅密钥发布到https://api.cognitive.microsoft.com/sts/v1.0/issueToken 您可以使用邮递员来执行此操作。 然后将返回值添加到标题中。

    client.Options.SetRequestHeader(“ Authorization”,“ eyJ0eXAiOiJKV1Q .... uW72PAOBRcUvqY”);

在此处输入图片说明

所以我需要部分结果而不是等待录制完成

您可以使用GetAudioFileStream()方法,例如:

    var audioRecordTask = await recorder.StartRecording();
    using (var stream = recorder.GetAudioFileStream ())
    {
        //this will get the recording audio data as it continues to record
    }

UPDATE2:
websoket部件代码:

    var client = new ClientWebSocket();
    client.Options.UseDefaultCredentials = true;
    client.Options.SetRequestHeader("X-ConnectionId", System.Guid.NewGuid().ToString());
    client.Options.SetRequestHeader("Authorization", "eyJ0eXAiOiJKV1QiL....16pbFPOWT3VHXot8");
    var a = client.ConnectAsync(new Uri("wss://speech.platform.bing.com/speech/recognition/Dictation/cognitiveservices/v1"), CancellationToken.None);
    a.Wait();

注意 :保持您的授权值是最新的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM