Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336

Microsoft Speech Recognition

09.01.2019, 22:29. Показов 3837. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Опишу ситуацию полностью.

Скачал и установил такие пакеты, в таком порядке:
1. MicrosoftSpeechPlatformSDK.msi
2. SpeechPlatformRuntime.msi
Остальное отсюда:
3. MSSpeech_SR_en-US_TELE.msi
4. MSSpeech_SR_ru-RU_TELE.msi
5. MSSpeech_TTS_en-US_Helen.msi
6. MSSpeech_TTS_ru-RU_Elena.msi

То есть SDK, Runtime, и языковые пакеты распознавания и синтеза русского и английского языка.
Всё скачано как Вы понимаете с официального сайта.

Код синтеза как русского так и английского языка работает как надо.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void SpeakString(LPCWSTR str, LPCWSTR lang_attr)
{
    CComPtr<ISpVoice> cpVoice;
    if (SUCCEEDED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&cpVoice)))
    {
        CComPtr<ISpObjectToken> cpVoiceToken;
        SpFindBestToken(SPCAT_VOICES, lang_attr, L"", &cpVoiceToken);
 
        cpVoice->SetVoice(cpVoiceToken);
        cpVoice->Speak(str, SPF_DEFAULT, NULL);
    }
}
 
int main()
{
    if (FAILED(CoInitialize(NULL)))
    {
        std::cerr << "CoInitialize failed\n";
        return 1;
    }
 
    SpeakString(L"One, two, three", L"Language=409");
    Sleep(1000);
    SpeakString(L"Один, два, три", L"Language=419");
 
    CoUninitialize();
    return 0;
}


А вот распознавание ни в какую. Ошибки начинаются здесь.
C++
1
2
3
4
5
6
7
    CComPtr<ISpRecognizer> cpEngine;
    hr = cpEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
    if (FAILED(hr))
    {
        DWORD dwLastError = GetLastError();
        std::cerr << "Error code: 0x" << std::hex << dwLastError << ". CoCreateInstance returned: 0x" << hr << "\n";
    }
GetLastError возвратил 0x3f0
An attempt was made to reference a token that does not exist.
То есть токен не существует.
CoCreateInstance возвратил 0x80040154, то есть класс не сушествует.

Как решить эту проблему? Кто-нибудь с таким сталкивался?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2019, 22:29
Ответы с готовыми решениями:

Microsoft.Speech.Recognition тест-провал
здрасьте. нашел на просторах тырнета интересный код решил его повторить но в конце так и не понял что и куда должно выводиться? если кто...

Microsoft.Speech.Recognition - несколько слов
Всем доброго времени. Делаю программу с голосовым распознаванием команд. Сабж. Покопался на форуме, нашел коды для распознавания, но...

Microsoft Speech Recognition Platform - как одновременно распознавать и русский, и английский
Добрый день. Использую Microsoft Speech Recognition Platform для распознавания голосового ввода. System.Globalization.CultureInfo ci; ...

11
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,098
10.01.2019, 00:00
Вам принципиально нужен CLSID_SpSharedRecognizer? Если нет, то можно попробовать с CLSID_SpInprocRecognizer.
1
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
10.01.2019, 00:04  [ТС]
Ygg, с SAPI работаю впервые, и толком здесь пока ещё не освоился, то есть кодами с интернета руководился. Буду премного благодарен, если поможете куском кода.
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,098
10.01.2019, 00:14
Да код тот же, только замените один CLSID на другой.
C++
1
2
//hr = cpEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
hr = cpEngine.CoCreateInstance(CLSID_SpInprocRecognizer);
1
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
10.01.2019, 00:20  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
Да код тот же, только замените один CLSID на другой.
То есть последующие вызовы процедур ничем отличаться не будут?
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,098
10.01.2019, 00:28
Получаемый интерфейс один и тот же, поэтому особой разницы быть не должно. Как я понял, Inproc - движок для использования в рамках одной программы. Shared - более продвинутая версия движка для его использования одновременно в нескольких программах на одном ПК. Возможно, для работы с продвинутым движком нужно что-то ещё.
1
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
10.01.2019, 13:34  [ТС]
Ygg, не знаю в чём проблема, но всё равно что-то ошибки лезут.
Всё время ошибка на LoadDictation. Возвращает 0x8004503A.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
bool ShowError(int n, HRESULT hr)
{
    DWORD dwLastError = GetLastError();
    std::cerr << "Error #" << n << ". GetLastError: 0x" << std::hex << dwLastError << ". Procedure returned: 0x" << hr << "\n" << std::dec;
    return false;
}
 
bool RecognizeEngine()
{
    HRESULT hr;
 
    CComPtr<ISpRecognizer> cpRecognizer;
    CComPtr<ISpAudio> cpAudio;
    CComPtr<ISpObjectToken> cpObjectToken;
    CComPtr<ISpRecoContext> cpRecoContext;
    CComPtr<ISpRecoGrammar> cpRecoGrammar;
 
    hr = CoCreateInstance(CLSID_SpInprocRecognizer, NULL, CLSCTX_ALL, IID_ISpRecognizer, (void **)&cpRecognizer);
    if (FAILED(hr))
        return ShowError(1, hr);
 
    
    hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &cpAudio);
    if (FAILED(hr))
        return ShowError(2, hr);
 
    hr = cpRecognizer->SetInput(cpAudio, TRUE);
    if (FAILED(hr))
        return ShowError(3, hr);
 
 
    hr = SpFindBestToken(SPCAT_RECOGNIZERS, L"Language=419", L"", &cpObjectToken);
    if (FAILED(hr))
        return ShowError(4, hr);
 
    hr = cpRecognizer->SetRecognizer(cpObjectToken);
    if (FAILED(hr))
        return ShowError(5, hr);
 
    hr = cpRecognizer->CreateRecoContext(&cpRecoContext);
    if (FAILED(hr))
        return ShowError(6, hr);
    
    hr = cpRecoContext->CreateGrammar(1, &cpRecoGrammar);
    //hr = cpRecoContext->CreateGrammar(0, &cpRecoGrammar);
    if (FAILED(hr))
        return ShowError(7, hr);
 
    //hr = cpRecoGrammar->LoadDictation(0, SPLO_DYNAMIC);
    hr = cpRecoGrammar->LoadDictation(0, SPLO_STATIC);
    if (FAILED(hr))
        return ShowError(8, hr);
 
 
    hr = cpRecoContext->SetNotifyWin32Event();
    if (FAILED(hr))
        return ShowError(9, hr);
 
    auto hEvent = cpRecoContext->GetNotifyEventHandle();
    
    hr = cpRecoContext->SetInterest(SPFEI(SPEI_RECOGNITION) | SPFEI(SPEI_END_SR_STREAM), SPFEI(SPEI_RECOGNITION) | SPFEI(SPEI_END_SR_STREAM));
    if (FAILED(hr))
        return ShowError(10, hr);
 
 
    hr = cpRecoGrammar->SetDictationState(SPRS_ACTIVE);
    if (FAILED(hr))
        return ShowError(11, hr);
 
    return true;
}
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,098
10.01.2019, 14:03
Цитата Сообщение от fastb1t Посмотреть сообщение
Всё время ошибка на LoadDictation
К сожалению, не очень могу помочь, так как не занимался данным SDK. Просто есть некоторый опыт работы с майкрософтными COM библиотеками и имею некоторое представление, что это такое, как это должно использоваться и на какие грабли обычно наступают люди только знакомящиеся с этим. Нужно смотреть код ошибки из HRESULT и искать его описание. Вроде была какая-то функция или целый интерфейс для перевода кода в текстовое описание. И нужно читать документацию соответствующих функций LoadDictation.
0
Заблокирован
12.01.2019, 00:32
Я хочу вставить свое. Хоть я и не профессионал, но все же.
Это. Вам однозначно нужен IDA Disassembler. Он дизассемблирует код и представляет его в виде макро ассемблера WinAPI. Имена функций такие же, как и в C++. Вообще, на макро ассемблере, например
Assembler
1
2
invoke Sleep, 1000
invoke Beep, 1000, 100
Почти тот же C++, никакой разницы.
Т.е. по сути дела если Вы дизассемблируете, что именно происходит, возни будет меньше, чем осваивать весь API. Я этим средством всегда проверяю программы на вирусы. Если в программе присутствует invoke CreateFileA, PhysicalDrive0, IO, то значит там обязательно вирус. Он у меня вместо антивиря стоит... Но говорю же, лучше этого дизассемблера, никаким отладчиком нельзя ассемблерный код перевести в понятный Си...
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
12.01.2019, 00:41  [ТС]
Google-Bot, спасибо за желание помочь, но это совсем не в тему... И вообще чушь несёте...
0
Заблокирован
20.01.2019, 19:19
fastb1t, желание помочь у меня еще сохранилось.
И может не в тему но
В какой среде Вы работаете?
Обычно бывает еще такая фигня что даже код, работающий в разных версиях Studio не будет работать в 2017 из-за нововведений
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
20.01.2019, 19:46  [ТС]
Цитата Сообщение от Google-Bot Посмотреть сообщение
В какой среде Вы работаете?
Среда здесь ни при чём, код компилируемый.
Цитата Сообщение от Google-Bot Посмотреть сообщение
Обычно бывает еще такая фигня что даже код, работающий в разных версиях Studio не будет работать в 2017 из-за нововведений
Что Вы имеете ввиду? Ни разу с таким не сталкивался. В vs2017 работаю больше года, и ни разу с таким не сталкивался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2019, 19:46
Помогаю со студенческими работами здесь

Speech recognition в XNA
Добрый день! Столкнулся со странной проблемой при разработке проекта в XNA Необходимо сделать распознавание речи, до которого я еще...

Что делать, если модуль speech recognition не найден?
Запустив файл python, через консоль, выдается ошибка No module named 'speech_recognition'. Хотя, speech_recognition установлен на...

Что лучше использовать для распознования русского языка System.Speech или Microsoft.Speech?
Здравствуйте, у меня проблемы со speech recognition c# в Windows 7, что мне лучше использовать System.Speech или Microsoft.Speech? Как я...

Microsoft.Speech
Как включить в проект? Если можно, прямо алгоритм, начиная от скачивания.

Microsoft Speech Platform
Здравствуйте. Я сильно туплю и не могу понять. Скачал и установил Microsoft Speech Platform - SDK, Microsoft Speech Platform - Runtime,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru