2011-12-03 30 views
30

Tôi đang phát triển một bài phát biểu nguyên mẫu cho ứng dụng phụ đề văn bản cho một dự án Đại học. Tôi sẽ sử dụng nhận dạng cử chỉ trong dự án của tôi vào cuối, vì vậy tôi nghĩ rằng nên sử dụng Kinect làm nguồn micrô, thay vì sử dụng micrô bổ sung. Ý tưởng ứng dụng của tôi là để nhận ra các bài phát biểu tự phát như câu dài và phức tạp (tôi hiểu nó sẽ không phải là lời nói chính tả sẽ không hoàn hảo). Tôi đã nhìn thấy nhiều mẫu giọng nói Kinect, nơi nó làm cho một tham chiếu đến Microsoft.Speech, nhưng không phải System.Speech. Khi tôi cần đào tạo công cụ phát biểu và tải DictationGrammar vào Công cụ nhận dạng giọng nói, Microsoft.Speech là lựa chọn duy nhất cho tôi.Sử dụng System.Speech với Kinect

Tôi đã cố gắng làm cho nó hoạt động trong khi sử dụng Kinect làm nguồn âm thanh micrô trực tiếp, nhưng vì tôi đang tải Kinect để xem trước video và nhận dạng cử chỉ, tôi không thể truy cập nó dưới dạng micrô trực tiếp.

Đây là mã truy cập vào micro trực tiếp mà không cần tải phần cứng Kinect cho cử chỉ, vv, và hoạt động hoàn hảo:

private void InitializeSpeech() 
{ 
    var speechRecognitionEngine = new SpeechRecognitionEngine(); 
    speechRecognitionEngine.SetInputToDefaultAudioDevice(); 
    speechRecognitionEngine.LoadGrammar(new DictationGrammar()); 
    speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); 
    speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text); 
} 

Và đây là nơi mà tôi cần phải truy cập vào các nguồn truy cập thông qua Kinect khi nó đã được nạp, mà không làm gì cả. Nay tôi muốn được thực hiện:

using (var audioSource = new KinectAudioSource()) 
{ 
    audioSource.FeatureMode = true; 
    audioSource.AutomaticGainControl = false; 
    audioSource.SystemMode = SystemMode.OptibeamArrayOnly; 

    var recognizerInfo = GetKinectRecognizer(); 
    var speechRecognitionEngine = new SpeechRecognitionEngine(recognizerInfo.Id); 

    speechRecognitionEngine.LoadGrammar(new DictationGrammar()); 
    speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text); 

    using (var s = audioSource.Start()) 
    { 
     speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null)); 
     speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); 
    } 
} 

Vì vậy, câu hỏi là, nó thậm chí có thể sử dụng System.Speech thay vì Microsoft.Speech với Kinect SDK hiện tại, và những gì tôi làm sai trong mẫu mã thứ 2 ?

GetKinectRecognizer Phương pháp

private static RecognizerInfo GetKinectRecognizer() 
{ 
    Func<RecognizerInfo, bool> matchingFunc = r => 
    { 
     string value; 
     r.AdditionalInfo.TryGetValue("Kinect", out value); 
     return "True".Equals(value, StringComparison.InvariantCultureIgnoreCase) && "en-US".Equals(r.Culture.Name, StringComparison.InvariantCultureIgnoreCase); 
    }; 

    return SpeechRecognitionEngine.InstalledRecognizers().Where(matchingFunc).FirstOrDefault(); 
} 
+0

Windows nhận Kinect làm đầu vào micrô, vì vậy tất cả thư viện giọng nói sẽ hoạt động tốt. Bạn có thể chạy các mẫu âm thanh/giọng nói được cung cấp cùng với Kinect SDK để xác minh thiết bị đang hoạt động không? Đoạn mã trên trông có vẻ ổn với tôi, nhưng bạn có thể đăng phương thức GetKinectRecognizer mà bạn đang gọi không? – LewisBenge

+0

Xin chào. Xin lỗi vì trả lời muộn. Vui lòng tham khảo bản chỉnh sửa ở trên để xem phương pháp GetKinectRecognizer tôi đang sử dụng, về cơ bản là phương pháp từ mẫu Kinect. –

+0

@LewisBenge, bạn có thấy câu trả lời của Dan Clark không? –

Trả lời

3

Từ thí nghiệm của riêng tôi, tôi có thể nói với bạn rằng bạn có thể trong thực tế sử dụng cả hai thư viện cùng một lúc.

Hãy thử mã này thay vì mã hiện tại của bạn (chắc chắn rằng bạn thêm một tham chiếu đến System.Speech, rõ ràng):

using (var audioSource = new KinectAudioSource()) 
{ 
    audioSource.FeatureMode = true; 
    audioSource.AutomaticGainControl = false; 
    audioSource.SystemMode = SystemMode.OptibeamArrayOnly; 

    System.Speech.Recognition.RecognizerInfo ri = GetKinectRecognizer(); 
    var speechRecognitionEngine = new SpeechRecognitionEngine(ri.Id); 

    speechRecognitionEngine.LoadGrammar(new DictationGrammar()); 
    speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text); 

    using (var s = audioSource.Start()) 
    { 
     speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null)); 
     speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); 
    } 
} 

Good Luck !!!

+0

Tôi không thấy System.Speech, chỉ cần Speech –

+0

khi thử mẫu SpeechBasics-WPF từ Kinect SDK 1.8 với Visual Studio 2015, tại bóng đèn Quick Actions nó hiển thị bên cạnh các mệnh đề sử dụng tại MainWindows.xaml.cs, đề xuất đơn giản hóa "sử dụng Microsoft.Speech.AudioFormat;" và "sử dụng Microsoft.Speech.Recognition;" để "sử dụng Speech.AudioFormat;" và "Speech.Recogniton;" tương ứng –

+0

Đoạn mã trên là từ Kinect Beta SDK rõ ràng (bạn không thể trực tiếp khởi tạo lớp nguồn âm thanh tại Kinect SDK v1.8 chẳng hạn, cần lấy nó từ một đối tượng KinectSensor). Người ta có thể tìm thấy mã về cách sử dụng Microsoft.Speech hoặc System.Speech tại http://SpeechTurtle.codeplex.com (có một số mã biên dịch có điều kiện ở đó để chuyển đổi giữa hai). Lưu ý rằng nhóm Kinect cho thấy Microsoft.Speech phù hợp hơn với mảng micrô của Kinect. Ngoài ra, System.Speech có ít ngôn ngữ hơn, tuy nhiên nó hỗ trợ Dictation miễn phí quá ngoài các lệnh thoại mà Microsoft.Speech hỗ trợ –

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