2012-09-10 183 views
5

Tôi đang cố gắng để có được SAPI 5.4 (cũng là MS Speech Platform SDK v11) để thực hiện nhận dạng giọng nói liên tục trên âm thanh đến từ một Skype gọi điện.Nhận dạng giọng nói trong C# với SAPI 5.4 hoặc MS Speech SDK v11 bằng cách sử dụng MemoryStream từ Skype gọi

Tôi có thể sử dụng SKYPE4COMLib để lấy âm thanh đến từ Skype và đẩy nó qua cổng TCP bằng cách đưa ra lệnh ALTER CALL. Bạn có thể hướng âm thanh Skype vào tập tin hoặc ổ cắm TCP. Tệp đã hoạt động tốt, nhưng tôi muốn nó chạy nhận dạng trực tiếp để sử dụng ổ cắm TCP.

Sau đó tôi đã xây dựng một trình nghe TCP để thu thập dữ liệu đến (định dạng thô âm thanh) và chuyển mảng byte dưới dạng MemoryStream sang SAPI. Tôi đã thiết lập SAPI để mong đợi âm thanh thô ở định dạng 16bit, 16khz, mono, PCM. Tuy nhiên một sự kiện công nhận không bao giờ xảy ra ?!

Tôi đã thử lưu âm thanh thô vào đĩa thay thế, sau đó đọc vào SAPI và nó hoạt động tốt ... do đó dữ liệu chính nó là tốt và Skype đang gửi chính xác trên âm thanh. Tuy nhiên điều này không cho phép tôi thực hiện công nhận liên tục mà tôi cần.

Mã nhận dạng SAPI hoạt động tốt bằng cách sử dụng tệp WAV hoặc tệp thô được tải từ đĩa hoặc micrô. Tôi chỉ không thể làm cho nó hoạt động từ một MemoryStream.

Tôi tìm thấy bài viết tương tự này, không có đề xuất nào có vẻ phù hợp với tôi và cuộc thảo luận dường như đã yên lặng.

Streaming input to System.Speech.Recognition.SpeechRecognitionEngine

Có ai có bất kỳ hướng dẫn về làm thế nào để thành công có được SAPI tiếp tục nhận bài phát biểu từ âm thanh thô gửi như một MemoryStream trong C#?

+0

Nếu bạn muốn làm công nhận liên tục, lý do tại sao bạn đang sử dụng một 'MemoryStream' để đệm nó? Bạn nên cung cấp một 'NetworkStream' trực tiếp cho SAPI, tùy chọn với BufferedStream ở phía trước nó. Bạn có thể cần xuất phát từ 'NetworkStream' để ghi đè' Seek'. –

+0

Tôi đã thử điều này đã được đề xuất trên liên kết đó trong câu hỏi, nhưng tôi không thể làm cho nó hoạt động. Đây có phải là điều bạn đang đề xuất không? NetworkStream netStream = new NetworkStream (socket, true); BufferedStream buffStream = new BufferedStream (netStream, 8000 * 16 * 1); appRecognizer.SetInputToAudioStream (buffStream, formatInfo); – timemirror

+0

Bạn cần tìm nguồn từ luồng và ghi đè Tìm kiếm, như đã lưu ý. –

Trả lời

0

Như bạn đang sử dụng dữ liệu âm thanh, tôi nghĩ rằng bạn nên sử dụng recognizer.RecognizeAsync

+0

Hi Patel.NET - cảm ơn, yer Tôi đang sử dụng recognizer.RecognizeAsync (RecognizeMode.Multiple). Vấn đề là khi bạn truyền dữ liệu, nó không bao giờ làm tăng sự kiện nhận ra, vì vậy bạn cần ghi đè lên lớp luồng. – timemirror