Произошло необработанное исключение типа «System.FormatException» в Microsoft.Speech.dll.

Я только что попытался использовать пользовательское произношение, используя лексикон PLS по ссылке http://msdn.microsoft.com/en-us/library/hh378403(v=office.14).aspx. Мой файл .pls выглядит следующим образом

Additional information: Данные словаря недействительны или повреждены.

<?xml version="1.0" encoding="UTF-8"?>

<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> scale </grapheme>
        <phoneme> S K A L E </phoneme>
    </lexeme>
</lexicon>

and my grammar file is as pronunciation.grxml


<?xml version="1.0" encoding="UTF-8"?>
<grammar 
    version="1.0" 
    xml:lang="en-US" 
    root="colors" 
    sapi:alphabet="x-microsoft-ups" 
    xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions" 
    xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0" >

  <lexicon uri="C:\Users\sony vaio\Documents\Visual Studio 2012\Projects\ConsoleApplication5\ConsoleApplication5\bin\Debug\Blue.pls" type="application/vdn.ms-sapi-lex"/>

  <rule id="colors" scope="public">
      <one-of>  
        <item> scale </item>
      </one-of>
  </rule>

</grammar>

и моя программа на С#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using Microsoft.Speech;
using Microsoft.Speech.Recognition;
using Microsoft.Speech.Recognition.SrgsGrammar;

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

            using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")))
            {

                String currDirPath = Environment.CurrentDirectory;

                string xmlGrammar = currDirPath + "\\pronunciation.grxml";
                string cfgGrammar = currDirPath + "\\pronunciation.cfg";
                FileStream fs = new FileStream(cfgGrammar, FileMode.Create);
                XmlReader reader = XmlReader.Create(xmlGrammar);

                //compile the grammar *.grxml to *.cfg file.
                SrgsGrammarCompiler.Compile(reader, (Stream)fs);
                fs.Close();
                Grammar g = new Grammar(cfgGrammar, "colors");
                Console.WriteLine(currDirPath+cfgGrammar);

                recognizer.LoadGrammarAsync(g);

                // Add a handler for the speech recognized event.
                recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
                // Configure the input to the speech recognizer.
                recognizer.SetInputToDefaultAudioDevice();

                // Start asynchronous, continuous speech recognition.
                recognizer.RecognizeAsync(RecognizeMode.Multiple);

                // Keep the console window open.
                while (true)
                {
                    Console.ReadLine();
                }
            }
        }

        // speech recognised event handler

        static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            string lines = e.Result.Text;
            Console.WriteLine("Speak loudly");
            Console.WriteLine("Recognized text: " + e.Result.Text);
            Console.WriteLine("semantic value: " + e.Result.Semantics.Value.ToString());
       }
}

но всякий раз, когда я пытаюсь скомпилировать его и использовать для распознавания «масштаба», он всегда показывает, что «Необработанное исключение типа «System.FormatException» произошло в Microsoft.Speech.dll. Дополнительная информация: данные лексикона недействительны или повреждены».

Хотя, когда используется встроенное произношение, оно работает, но произношение во внешней ссылке, похоже, не работает. Есть ли обходной путь? Любая помощь будет оценена по достоинству. Пожалуйста.


person devsda    schedule 05.05.2013    source источник
comment
Я не смог воспроизвести вашу проблему. Хотя я сделал два изменения в приведенном выше коде, и это сработало для меня. Я заменил использование Microsoft.* на System.* и вместо этого сослался на эти сборки. У меня не установлены сборки Microsoft.Speech. Но я не получаю исключение формата, которое вы видите. Можете попробовать это против сборок System.Speech и посмотреть, есть ли у вас проблемы? Также в каких форматах вы сохраняете файлы grxml и pls, когда открываете их в текстовом редакторе? UTF-8 является стандартным.   -  person Matt Johnson    schedule 06.05.2013
comment
Привет, спасибо @MattJohnson. Это сработало. Но означает ли это, что сборка microsoft. * не поддерживает эту вещь, и, возможно, именно поэтому я получаю ошибку system.formatException или данные лексикона, содержащие или поврежденные. И да, формат, в котором я сохраняю свои grxml и pls, соответствует стандарту UTF-8. Еще хотелось бы узнать, почему не работает microsoft.*?   -  person devsda    schedule 07.05.2013
comment
Без проблем. Переход с Microsoft.Speech на System.Speech не должен иметь никакого значения. Насколько я понимаю, они оба поддерживают спецификацию W3C и не предъявляют особых требований к формату грамматики.   -  person Matt Johnson    schedule 07.05.2013


Ответы (1)


Перемещение приведенного выше кода из Microsoft.Speech.Recogonition в System.Speech.Recognition устраняет проблему с указанным выше исключением формата.

Что касается того, почему Microsoft.Speech.Recognition выдает ошибку, я не уверен. Я знаю, что официальная спецификация W3C официально поддерживает тег лексикона в файле xml (хотя у Microsoft есть очень конкретные правила относительно того, где должен располагаться тег лексикона, это кажется правильным):

http://www.w3.org/TR/speech-grammar/#S4 .10

Лексикон. Формат грамматики не учитывает загрузку словарей или произношение слов, на которые ссылается грамматика. Рабочая группа W3C Voice Browser рассматривает возможность разработки стандартного формата лексикона. Если формат будет разработан, в эту спецификацию грамматики будут внесены соответствующие обновления.

Фактическая спецификация формата лексикона еще не завершена:

http://www.w3.org/TR/lexicon-reqs/#pronun

Таким образом, если собственный пример Microsoft связан здесь не работает, похоже, это ошибка. Особенно, если все, что вы сделали, чтобы исправить исключение формата, — это перейти с Microsoft.Speech на System.Speech.

person Matt Johnson    schedule 07.05.2013