Как получить распознавание речи для обнаружения маркеров акцента SAPI?

Можно извлечь фонемы по умолчанию для данного слова через SAPI:

  1. Голосовое слово с преобразованием текста в речь и сохранение вывода в формате .wav
  2. Используйте .wav в качестве входных данных для распознавания речи
  3. При распознавании слова извлеките фонемы из распознанных элементов словосочетания.

Однако мне не удалось зафиксировать (если они доступны) маркеры акцента («1» и «2» в соответствии с Таблица фонем американского английского). Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: вот что я пытался до сих пор (не красиво, но функционально). К сожалению, похоже, что SpeechVisemeFeature всегда показывает «SVF_None», даже когда я вручную добавляю ударение к слову через SAPI Speech. Модификация словаря. Кто-нибудь знает, почему это так?

using System;
using System.Threading;
using SpeechLib;
using System.Windows.Forms;

namespace PhoneEmphasis
{
    class Program
    {
        static string myWord = "hello";
        static SpPhoneConverter c = new SpPhoneConverter();
        static Thread t = null;

        static void Main(string[] args)
        {
            c.LanguageId = 1033;
            t = new Thread(test);
            t.Start();
            t.Join();
            Console.WriteLine("done");
            Console.ReadLine();
        }

        private static void test()
        {
            SpVoice v = new SpVoice();
            //v.EventInterests = SpeechVoiceEvents.;
            v.Phoneme += new _ISpeechVoiceEvents_PhonemeEventHandler(Phoneme_Handler);
            v.EndStream += new _ISpeechVoiceEvents_EndStreamEventHandler(EndStream_Handler);
            v.Speak(myWord, SpeechVoiceSpeakFlags.SVSFlagsAsync);
            Application.Run();
        }

        private static void Phoneme_Handler(int StreamNumber, object StreamPosition, int Duration, short NextPhoneId, SpeechVisemeFeature Feature, short CurrentPhoneId)
        {
            Console.WriteLine("Phoneme = " + c.IdToPhone(CurrentPhoneId).ToString() + " , VisemeFeature = " + Feature.ToString());
        }

        private static void EndStream_Handler(int StreamNumber, object StreamPosition)
        {
            Console.WriteLine("end stream!");
            t.Abort();
        }
    }
}

person Exergist    schedule 21.05.2019    source источник
comment
Маловероятно, что в фонемах будут доступны маркеры ударения, так как механизм SR намеренно игнорирует ударение. Рассматривали ли вы возможность использования события SPEI_PHONEME из механизма TTS?   -  person Eric Brown    schedule 23.05.2019
comment
Спасибо за предложение! Это привело меня к поиску события SpVoice Phoneme. Но я действительно изо всех сил пытаюсь заставить его загореться. Я обновлю свой исходный вопрос кодом, который я пытаюсь. @EricBrown, может быть, у вас есть предложения?   -  person Exergist    schedule 23.05.2019
comment
Обновлено снова с работающими событиями   -  person Exergist    schedule 24.05.2019
comment
Это может быть не основной проблемой, но вполне возможно, что наборы фонем переводятся из SAPI в UPS, и код, выполняющий преобразование фонем, выглядит так, как будто он удаляет SpeechVisemeFeature как часть преобразования. Вы можете попробовать вызвать ISpPhoneticAlphabetSelection::SetAlphabetToUPS< /a>, который реализован ISpVoice, и посмотрите, работает ли вам изменение алфавита фонем лучше. К сожалению, для этого вам придется использовать C++.   -  person Eric Brown    schedule 25.05.2019
comment
Кстати, если это не сработает, я больше ничем не могу помочь. Механизм TTS представляет собой удивительно непрозрачный код и почти полностью управляется данными.   -  person Eric Brown    schedule 25.05.2019
comment
Если бы я снял ограничение на использование SAPI, можно ли было бы найти ударение для слова give другими способами? Может как ИБП?   -  person Exergist    schedule 25.05.2019
comment
Отступим на секунду. Зачем нужны маркеры акцента?   -  person Eric Brown    schedule 27.05.2019
comment
Я разрабатываю приложение для улучшения взаимодействия с речевым словарем. Я уже могу извлечь произношение по умолчанию из заданного слова, но оно не включает маркеры ударения. Слово «привет» на самом деле должно произноситься «h eh — low 1», но в настоящее время я не могу произнести 1, хотя TTS ясно озвучивает его.   -  person Exergist    schedule 28.05.2019
comment
Что ж, я полагаю, вы могли бы использовать ISpEnginePronunciation, но его сложно использовать, и он не гарантирует, что вы вернете единственное произношение, даже если вы предоставите контекст. Вам также придется сделать это на C++, так как для этого нет интерфейса автоматизации.   -  person Eric Brown    schedule 29.05.2019
comment
Проклятие. И кодирование на C++ выходит за рамки моих знаний. Хотелось бы, чтобы был способ увидеть, что будет на выходе ISpEnginePronunciation и включает ли он маркеры выделения. @EricBrown, есть ли примеры, на которые можно было бы сослаться, как это сделать на C++?   -  person Exergist    schedule 30.05.2019