使用Microsoft Cognitive Speech + Websocket进行连续语音识别 - Xamarin

时间:2018-04-06 08:58:46

标签: c# android xamarin speech-recognition microsoft-cognitive

我正在尝试使用 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,所以我必须

  1. 从麦克风录制(我使用的是 Plugin.AudioRecorder
  2. 将它切成小块
  3. 使用websocket
  4. 异步流式传输小块

    我想要达到的目的:使用带有Microsoft认知语音的麦克风语音到文本,听写模式,所以我需要部分结果而不是等待录音完成。

1 个答案:

答案 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的示例。

<强>更新

  

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

标题中缺少某些值。

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

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

  3. enter image description here

      

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

    您可以使用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();
    

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