我正在尝试使用 Microsoft认知语音为 Xamarin Android 从麦克风构建连续语音识别 。我不认为Xamarin有库,所以我稍微修改了“Xamarin.Cognitive.BingSpeech ”库(端点等)以使其工作。我有一些问题
我希望按照https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/websocketprotocol中的教程连接到Microsoft网络套接字。
我尝试使用基本的 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,所以我必须
我想要达到的目的:使用带有Microsoft认知语音的麦克风语音到文本,听写模式,所以我需要部分结果而不是等待录音完成。
答案 0 :(得分:2)
我认为您希望将语音转换为文本。
由于Xamarin.Cognitive.BingSpeech需要您录制语音并将其作为文件或流发送到服务器。我想你可以尝试使用Android speech。它还可以将文本转换为语音。 Here就是一个例子。
如果您想使用Xamarin.Cognitive.BingSpeech,您可以使用Audio Recorder plugin录制语音并使用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>);
Here是Xamarin.Cognitive.BingSpeech的示例。
<强>更新强>
我总是得到“无法连接到远程服务器”,没有任何错误代码或任何内容。
标题中缺少某些值。
client.Options.SetRequestHeader("X-ConnectionId", System.Guid.NewGuid().ToString());
授权
您需要将订阅密钥发布到https://api.cognitive.microsoft.com/sts/v1.0/issueToken。你可以使用Postman来做到这一点。然后在标题中添加返回值。
client.Options.SetRequestHeader(“授权”,“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();
注意:保持授权的价值最新。