2014-06-04 2 views
3

flac 파일이 Windows의 사운드 레코더를 사용하여 매뉴얼을 기록하고 소프트웨어 변환기를 사용하여 변환 할 때 내 프로그램이 google에서 올바른 응답을받습니다.
하지만 프로그램에서 기록한 파일을 사용할 때 Google에서 "{"result ": []} "이 표시됩니다. 어떻게해야합니까? 여기 내 코드입니다 :
보낸 사람 :
Google 음성 텍스트 API C#

private static void CopyStream(FileStream fileStream, Stream requestStream) 
    { 
     var buffer = new byte[32768]; 
     int read; 
     while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      requestStream.Write(buffer, 0, read); 
     } 
    } 

    private static void ConfigureRequest(HttpWebRequest request) 
    { 
     request.KeepAlive = true; 
     request.SendChunked = true; 
     request.ContentType = "audio/x-flac; rate=44100"; 
     request.UserAgent = 
      "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2"; 
     request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip,deflate,sdch"); 
     request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-GB,en-US;q=0.8,en;q=0.6"); 
     request.Headers.Set(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.3"); 
     request.Method = "POST"; 
    } 
    using (var fileStream = new FileStream(@"C:\Users\Ahmad Mustofa\Documents\Visual Studio 2010\Projects\FP\FP\bin\Debug\voice.flac", FileMode.Open)) 
    { 
     const string requestUrl = "https://www.google.com/speech-api/v2/recognize?output=json&lang=ar-sa&key=AIzaSyBJ6VJ326Rpb23msih2wGhXENEwU1TF1PA&client=chromium&maxresults=1&pfilter=2"; 
     var request = (HttpWebRequest)WebRequest.Create(requestUrl); 
     ConfigureRequest(request); 
     var requestStream = request.GetRequestStream(); 
     CopyStream(fileStream, requestStream); 

     using (var response = request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       using (var zippedStream = new GZipStream(responseStream, CompressionMode.Decompress)) 
       { 
        using (var sr = new StreamReader(zippedStream)) 
        { 
          var res = sr.ReadToEnd(); 
          state.Text = res; 
        } 
       } 
      } 
     } 
    } 

WAV 레코더 :

 private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) 
     { 
      if (waveWriter == null) return; 

      waveWriter.WriteData(e.Buffer, 0, e.BytesRecorded); 
      waveWriter.Flush(); 
     } 
     fileName = "C:\\Users\\Ahmad Mustofa\\Documents\\Visual Studio 2010\\Projects\\FP\\FP\\bin\\debug\\voice.wav"; 
     int deviceNumber = hardware.SelectedItems[0].Index; 
     try 
     { 
      sourceStream = new NAudio.Wave.WaveIn(); 
      sourceStream.DeviceNumber = deviceNumber; 
      sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(44100, NAudio.Wave.WaveIn.GetCapabilities(deviceNumber).Channels); 

      sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable); 
      waveWriter = new NAudio.Wave.WaveFileWriter(fileName, sourceStream.WaveFormat); 

      sourceStream.StartRecording(); 
     } 
     catch (Exception ex) 
     { 
      state.Text = "disini" + ex.Message; 
     } 

FLAC 컨버터 :

 string inputFile = Path.Combine("wav ", input); 
     string outputFile = Path.Combine("flac", Path.ChangeExtension(input, ".flac")); 

     if (!File.Exists(inputFile)) 
      throw new ApplicationException("Input file " + inputFile + " cannot be found!"); 

     WavReader wav = new WavReader(inputFile); 

     using (var flacStream = File.Create(outputFile)) 
     { 
      FlacWriter flac = new FlacWriter(flacStream, wav.BitDepth, wav.Channels, wav.SampleRate); 
      // Buffer for 1 second's worth of audio data 
      byte[] buffer = new byte[wav.Bitrate/8]; 
      int bytesRead; 
      do 
      { 
       bytesRead = wav.InputStream.Read(buffer, 0, buffer.Length); 
       flac.Convert(buffer, 0, bytesRead); 
      } while (bytesRead > 0); 
      flac.Dispose(); 
      flac = null; 
     } 
+0

정확히 같은 문제가 있습니다. – superbre

답변

0

이 그것을 사용하고 uterance를 얻을 수 (구)와 자신감 (%)

 string toParse=(VALUE RETURNED BY GOOGLE) 
     var trsc1 = @"transcript"":"""; 
     var trsc2 = @""",""confidence"":"; 
     var trsc3 = @"}],""final"":"; 
     var start = toParse.IndexOf(trsc1) + trsc1.Length; 
     var end = toParse.IndexOf(trsc2); 
     var end2 = toParse.IndexOf(trsc3); 
     var vv1 = toParse.Substring(start, end - start); 
     var vv2 = toParse.Substring(end + trsc2.Length, end2 - (end + trsc2.Length)); 
     vv2 = vv2.Trim().Replace(".", ","); 

     float confidence = (float)Math.Round(double.Parse(vv2), 2); 
     string utterance = vv1; 
2

나는 또한 동일한 문제를 안고 있지만 깔끔한 해결책이 떠올랐다. 나는 Fiddler (http://www.telerik.com/fiddler/)를 사용하여 Chrome이 음성 인식을 수행하는 방법을 파악한 다음 요청을 전송하는 Chrome을 모방하는 코드를 만들었습니다. 이 접근법은 다른 URI를 사용하며 각 요청마다 다른 pair라는 16 자의 값이 있습니다. 간단한 임의 값 생성기 함수를 사용하여 요청에 대한 생성자 함수를 만들고 출력 값을 'json'으로 변경했습니다.

참고 : 위의 경우처럼 결과가 비어있을 수 있지만 대안에 다른 json 개체가 응답에 있습니다.

private void GoogleSpeechToText() 
    { 
     string uri = "https://www.google.com/speech-api/full-duplex/v1/up?output=json&key=AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw&pair=" + GenerateUnique(16) + "&lang=en-US&pFilter=2&maxAlternatives=10&client=chromium"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Timeout = 10000; 
     request.Method = "POST"; 
     request.Host = "www.google.com";    
     request.KeepAlive = true; 
     request.SendChunked = true; 
     request.ContentType = "audio/x-flac; rate=16000"; 
     request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-GB,en-US;q=0.8,en;q=0.6"); 
     request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"; 

     string path = @"C:\TestFolder\test_audio.flac";  
     FileInfo fInfo = new FileInfo(path); 
     var numBytes = fInfo.Length; 
     byte[] data; 

     using (FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     { 
      data = new Byte[numBytes]; 
      fStream.Read(data, 0, (int) numBytes); 
      fStream.Close(); 
     } 

     using (Stream reqStream = request.GetRequestStream()) 
      reqStream.Write(data, 0, data.Length); 

     try 
     { 
      WebResponse response = request.GetResponse(); 
      Stream respStream = response.GetResponseStream(); 

      if(response.ContentType == "application/json; charset=utf-8") 
      {      
       using (var sr = new StreamReader(respStream)) 
       { 
        var res = sr.ReadToEnd(); 
        textBox1.Text = res;       
       } 
      } 
     } 
     catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK); }    
    } 

    private string GenerateUnique(int length) 
    { 
     string[] LETTERS = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; 
     string[] DIGITS = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; 
     string buffer = ""; 
     Random random = new Random(); 

     for(int i = 0; i < length; i++) 
     {     
      int rnd = random.Next(2); 
      if (rnd == 1) 
       buffer += LETTERS[random.Next(LETTERS.Length)]; 
      else 
       buffer += DIGITS[random.Next(DIGITS.Length)]; 
     } 
     return buffer; 
    } 
-1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Net; 
using Newtonsoft.Json; 

namespace google_speech_api_trial4 
{ 
    class Program 
    { 
     public static string ACCESS_GOOGLE_SPEECH_KEY =  "AIzaSyDC8nM1S0cLpXvRc8TXrDoey-tqQsoBGnM"; 

    static void Main(string[] args) 
    { 
     GoogleSpeechRequest(); 
     Console.ReadLine(); 

    } 
      public static void GoogleSpeechRequest() 
    { 
      FileStream fileStream = File.OpenRead("my.flac"); 
     MemoryStream memoryStream = new MemoryStream(); 
     memoryStream.SetLength(fileStream.Length); 
     fileStream.Read(memoryStream.GetBuffer(), 0, (int)fileStream.Length); 
     byte[] BA_AudioFile = memoryStream.GetBuffer(); 
     HttpWebRequest _HWR_SpeechToText = null; 
     _HWR_SpeechToText = (HttpWebRequest)HttpWebRequest.Create("https://www.google.com/speech-api/v2/recognize?output=json&lang=en-us&key=" + ACCESS_GOOGLE_SPEECH_KEY); 
     _HWR_SpeechToText.Credentials = CredentialCache.DefaultCredentials; 
     _HWR_SpeechToText.Method = "POST"; 
     _HWR_SpeechToText.ContentType = "audio/x-flac; rate=44100"; 
     _HWR_SpeechToText.ContentLength = BA_AudioFile.Length; 
     Stream stream = _HWR_SpeechToText.GetRequestStream(); 
     stream.Write(BA_AudioFile, 0, BA_AudioFile.Length); 
     stream.Close(); 
     HttpWebResponse HWR_Response = (HttpWebResponse)_HWR_SpeechToText.GetResponse(); 

     StreamReader SR_Response = new StreamReader(HWR_Response.GetResponseStream()); 
     string responseFromServer = (SR_Response.ReadToEnd()); 

     String[] jsons = responseFromServer.Split('\n'); 
     String text = ""; 
     foreach (String j in jsons) 
     { 
      dynamic jsonObject = JsonConvert.DeserializeObject(j); 
      if (jsonObject == null || jsonObject.result.Count <= 0) 
      { 
       continue; 
      } 
      text = jsonObject.result[0].alternative[0].transcript; 
     } 
     Console.WriteLine(text); 
    } 
    } 
} 

내가 3 시간 동안 찾고 있었다, 내가 뻥 유지 { "결과 : []"} 나는 텍스트를 인쇄 할 때. 나는 그것이 오디오를 변환하지 않는다고 생각했다. 그러나 Json obj에는 두 줄이 있습니다. 두 번째 줄에는 오디오 텍스트가 있습니다. 그것을 인쇄하려면, 우리는 그것을 분석 할 필요가 있습니다. 오, 나는 또한 수입, 참조 및 사용에 관한 많은 문제에 직면했다. 하지만 마침내이 코드가 작동합니다.