2017-07-26 15 views
10

Tôi đang cố gắng ghi lại âm thanh và ngay lập tức gửi nó đến Bài phát biểu của IBM Watson để phiên âm. Tôi đã thử nghiệm Watson với một tệp WAV được tải từ đĩa và đã hoạt động. Mặt khác, tôi cũng đã thử nghiệm với ghi âm từ micro và lưu trữ nó vào đĩa, hoạt động tốt quá.Ghi âm WAV sang IBM Watson Bài phát biểu thành văn bản

Nhưng khi tôi cố gắng ghi lại âm thanh bằng NAudio WaveIn, kết quả từ Watson trống, như thể không có âm thanh.

Bất kỳ ai có thể tỏa sáng về điều này hoặc ai đó có một số ý tưởng?

private async void StartHere() 
{ 
    var ws = new ClientWebSocket(); 
    ws.Options.Credentials = new NetworkCredential("*****", "*****"); 

    await ws.ConnectAsync(new Uri("wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize?model=en-US_NarrowbandModel"), CancellationToken.None); 

    Task.WaitAll(ws.SendAsync(openingMessage, WebSocketMessageType.Text, true, CancellationToken.None), HandleResults(ws)); 

    Record(); 
} 

public void Record() 
{ 
    var waveIn = new WaveInEvent 
    { 
     BufferMilliseconds = 50, 
     DeviceNumber  = 0, 
     WaveFormat   = format 
    }; 

    waveIn.DataAvailable += new EventHandler(WaveIn_DataAvailable); 
    waveIn.RecordingStopped += new EventHandler(WaveIn_RecordingStopped); 
    waveIn.StartRecording(); 
} 

public void Stop() 
{ 
    await ws.SendAsync(closingMessage, WebSocketMessageType.Text, true, CancellationToken.None); 
} 

public void Close() 
{ 
    ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Close", CancellationToken.None).Wait(); 
} 

private void WaveIn_DataAvailable(object sender, WaveInEventArgs e) 
{ 
    await ws.SendAsync(new ArraySegment(e.Buffer), WebSocketMessageType.Binary, true, CancellationToken.None); 
} 

private async Task HandleResults(ClientWebSocket ws) 
{ 
    var buffer = new byte[1024]; 

    while (true) 
    { 
     var segment = new ArraySegment(buffer); 
     var result = await ws.ReceiveAsync(segment, CancellationToken.None); 

     if (result.MessageType == WebSocketMessageType.Close) 
     { 
      return; 
     } 

     int count = result.Count; 
     while (!result.EndOfMessage) 
     { 
      if (count >= buffer.Length) 
      { 
       await ws.CloseAsync(WebSocketCloseStatus.InvalidPayloadData, "That's too long", CancellationToken.None); 
       return; 
      } 

      segment = new ArraySegment(buffer, count, buffer.Length - count); 
      result = await ws.ReceiveAsync(segment, CancellationToken.None); 
      count += result.Count; 
     } 

     var message = Encoding.UTF8.GetString(buffer, 0, count); 

     // you'll probably want to parse the JSON into a useful object here, 
     // see ServiceState and IsDelimeter for a light-weight example of that. 
     Console.WriteLine(message); 

     if (IsDelimeter(message)) 
     { 
      return; 
     } 
    } 
} 

private bool IsDelimeter(String json) 
{ 
    MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)); 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ServiceState)); 
    ServiceState obj = (ServiceState) ser.ReadObject(stream); 

    return obj.state == "listening"; 
} 

[DataContract] 
internal class ServiceState 
{ 
    [DataMember] 
    public string state = ""; 
} 


Sửa: Tôi cũng đã cố gắng để gửi WAV "tiêu đề" trước khi StartRecording, như thế này

waveIn.DataAvailable += new EventHandler(WaveIn_DataAvailable); 
    waveIn.RecordingStopped += new EventHandler(WaveIn_RecordingStopped); 

    /* Send WAV "header" first */ 
    using (var stream = new MemoryStream()) 
    { 
     using (var writer = new BinaryWriter(stream, Encoding.UTF8)) 
     { 
      writer.Write(Encoding.UTF8.GetBytes("RIFF")); 
      writer.Write(0); // placeholder 
      writer.Write(Encoding.UTF8.GetBytes("WAVE")); 
      writer.Write(Encoding.UTF8.GetBytes("fmt ")); 

      format.Serialize(writer); 

      if (format.Encoding != WaveFormatEncoding.Pcm && format.BitsPerSample != 0) 
      { 
       writer.Write(Encoding.UTF8.GetBytes("fact")); 
       writer.Write(4); 
       writer.Write(0); 
      } 

      writer.Write(Encoding.UTF8.GetBytes("data")); 
      writer.Write(0); 
      writer.Flush(); 
     } 

     byte[] header = stream.ToArray(); 

     await ws.SendAsync(new ArraySegment(header), WebSocketMessageType.Binary, true, CancellationToken.None); 
    } 
    /* End WAV header */ 

    waveIn.StartRecording(); 

Trả lời

Các vấn đề liên quan