2012-07-17 3 views
14

Tôi đang thực hiện một số chuyển văn bản thành giọng nói và tôi muốn chỉ định một số cách phát âm đặc biệt trong tệp từ vựng. Tôi đã chạy MSDN's AddLexicon example nguyên văn, và nó nói câu nhưng nó không sử dụng từ vựng đã cho, một cái gì đó dường như bị hỏng.Làm cách nào để sử dụng từ vựng với SpeechSynthesizer?

Dưới đây là ví dụ được cung cấp:

using System; 
using Microsoft.Speech.Synthesis; 

namespace SampleSynthesis 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 

     // Initialize a new instance of the SpeechSynthesizer. 
     using (SpeechSynthesizer synth = new SpeechSynthesizer()) 
     { 

     // Configure the audio output. 
     synth.SetOutputToDefaultAudioDevice(); 

     PromptBuilder builder = new PromptBuilder(); 
     builder.AppendText("Gimme the whatchamacallit."); 

     // Append the lexicon file. 
     synth.AddLexicon(new Uri("c:\\test\\whatchamacallit.pls"), "application/pls+xml"); 

     // Speak the prompt and play back the output file. 
     synth.Speak(builder); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("Press any key to exit..."); 
     Console.ReadKey(); 
    } 
    } 
} 

và từ vựng file:

<lexicon version="1.0" 
     xmlns="http://www.w3.org/2005/01/pronunciation-lexicon" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon 
     http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd" 
     alphabet="x-microsoft-ups" xml:lang="en-US"> 


    <lexeme> 
    <grapheme> whatchamacallit </grapheme> 
    <phoneme> W S1 AX T CH AX M AX K S2 AA L IH T </phoneme> 
    </lexeme> 

</lexicon> 

Giao diện điều khiển mở ra, đọc văn bản, nhưng cách phát âm mới không được sử dụng. Dĩ nhiên tôi đã lưu tập tin vào c:\test\whatchamacallit.pls như được chỉ định.

Tôi đã thử các biến thể của Uri và tập tin vị trí (ví dụ @"C:\Temp\whatchamacallit.pls", @"file:///c:\test\whatchamacallit.pls"), đường dẫn tuyệt đối và tương đối, sao chép nó vào thư mục build vv

Tôi chạy Process Monitor và tập tin được không được truy cập. Nếu đó là một vấn đề về thư mục/tập tin (không phải là nó), tôi vẫn sẽ thấy các tin nhắn bị từ chối truy cập, tuy nhiên tôi không đăng nhập tham chiếu ngoại trừ một thư thỉnh thoảng từ trình soạn thảo. Tôi thấy tệp được truy cập khi tôi thử File.OpenRead.

Rất tiếc, không có thông báo lỗi khi sử dụng thùng rác Uri.

Khi điều tra thêm, tôi nhận ra ví dụ này là từ Microsoft.Speech.Synthesis, trong khi tôi đang sử dụng System.Speech.Synthesis ở đây. Tuy nhiên từ những gì tôi có thể nói họ giống hệt nhau ngoại trừ một số thông tin bổ sung và các ví dụ và cả hai điểm đến cùng một đặc điểm kỹ thuật. Điều này vẫn có thể là vấn đề?

tôi xác nhận dự án được thiết lập để sử dụng .NET Framework thích 4.

Tôi đã so sánh ví dụ từ MSDN để examples from the referenced spec, cũng như cố gắng những hoàn toàn nhưng nó đã không giúp. Xem xét các tập tin dường như không được truy cập tôi không ngạc nhiên.

(Tôi có thể sử dụng PromptBuilder.AppendTextWithPronunciation tốt nhưng đó là một sự thay thế nghèo đối với trường hợp sử dụng của tôi.)

là ví dụ trên MSDN bị hỏng? Làm thế nào để sử dụng một từ vựng với SpeechSynthesizer?

Trả lời

9

Sau nhiều nghiên cứu và cạm bẫy, tôi có thể đảm bảo với bạn rằng giả thiết của bạn chỉ đơn giản là sai. Vì lý do nào đó, System.Speech.Synthesis.SpeechSynthesizer.AddLexicon() thêm từ vựng vào danh sách nội bộ, nhưng không sử dụng nó. Có vẻ như không ai cố gắng sử dụng nó trước và lỗi này đã không được chú ý.

Microsoft.Speech.Synthesis.SpeechSynthesizer.AddLexicon() (thuộc về Microsoft Speech SDK), mặt khác hoạt động như mong đợi (nó chuyển từ vựng vào đối tượng COM để diễn giải nó như được quảng cáo).

Vui lòng tham khảo hướng dẫn này về cách cài đặt SDK: http://msdn.microsoft.com/en-us/library/hh362873%28v=office.14%29.aspx

Ghi chú:

  • người báo cáo các phiên bản 64-bit để gây ra ngoại lệ COM (vì thư viện không được cài đặt một cách chính xác) , tôi xác nhận điều này trên một 64bit Windows 7 máy
    • sử dụng phiên bản x86 circumvents vấn đề
  • hãy chắc chắn để cài đặt thời gian chạy trước SDK
  • hãy chắc chắn cũng phải cài đặt một ngôn ngữ runtime (như adviced trên trang được liên kết) như SDK không sử dụng hệ thống mặc định động cơ nói
+0

Tôi có nghĩa là từ những gì tôi có thể cho biết _documentation_ giống hệt nhau. Cuối cùng là một câu trả lời! Cảm ơn! –

+1

Các tài liệu là giống hệt nhau và điều này đã không được đề cập bất cứ nơi nào như là một lỗi được biết đến, đó là khá lạ. Dù sao, bạn được chào đón, hy vọng nó sẽ giúp :) –

+0

Vâng, chỉ đơn giản là không làm việc cả. –