Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++: COM, OLE, ActiveX

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
undiabler
4 / 4 / 0
Регистрация: 25.07.2012
Сообщений: 28
#1

Sapi, синтез русской речи - C++ COM

25.12.2012, 22:19. Просмотров 3095. Ответов 4
Метки нет (Все метки)

Использую sapi sdk 5.1 По умолчанию в системе установлен только английский голос.

Код:
C++
1
2
3
4
5
6
7
8
9
    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
 
    if( SUCCEEDED( hr ) )
    {
    
        hr = pVoice->Speak(L" Hello, world!",0, NULL );
        pVoice->Release();
        pVoice = NULL;
       }
Работает на ура, но нужно выводить именно на русском языке.

Установил Alyona22k. Теперь вопрос, как сменить язык?

Пробовал перебором:
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
        hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
    hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum);
 
 
    if (SUCCEEDED (hr))
    {
        hr = cpEnum->GetCount(&ulCount);
    }
 
    while (SUCCEEDED(hr) && ulCount--)
    {
        cpVoiceToken.Release();
 
        if (SUCCEEDED (hr))
        {
            hr = cpEnum->Next(1, &cpVoiceToken, NULL);
        }
 
        if (SUCCEEDED (hr))
        {
            hr = cpVoice->SetVoice(cpVoiceToken);
        }
 
        if (SUCCEEDED (hr))
        {
            hr = cpVoice->Speak( L"Test!", SPF_DEFAULT, NULL );
            hr = cpVoice->Speak( L"проверка!", SPF_DEFAULT, NULL );
            getch();
        }
        
    }
Молчит зараза. И я так понял алену он просто не видит. Есть пример нагугленый где добрый человек выложил екзешник програмки которая прекрасно подхватывает на лету все языки и говорит как на английском и на русском. Отсюда вывод что алену подключить можно, но как?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2012, 22:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Sapi, синтез русской речи (C++ COM):

sapi and C++ builder XE4 - C++ COM
Всем привет. Пишу на билдере прогу которая будет читать текст. ::CoInitialize(NULL); if( SUCCEEDED( hr ) ) { Word Saved8087CW =...

Распознавание речи(+ команд) - C++
привет!!) вопрос такой - при помощи чего можно распознавать речь, какие есть варианты?? интересует реализация прежде всего...

Синтез русской речи - C#
пишу программу где нужен синтез речи. на английском языке работает без проблем, но мне нужна русская болталка. скачал катерину, но возникла...

синтез речи - JavaScript
Как синтезировать текст в речь на сайте на лету? Есть ли какие то движки или библиотеки? Платные сервисы, типа yandex speech kit не...

Синтез речи - Visual Basic .NET
здравствуйте. есть приложение, которое в своей работе должно преобразовывать текст в речь. предполагается, что для этой цели будет...

распознавание русской речи на C# - C#
ФОРУМЧАНЕ поделитесь опытом и знаниями кто что знает о распознавании русской речи, любая информация будет полезна, итак в .net есть...

4
vxg
Модератор
3184 / 1987 / 227
Регистрация: 13.01.2012
Сообщений: 7,680
23.01.2013, 23:57 #2
диагональное пролистывание хелпа туманно намекает нам на то что вроде вы все делаете правильно. вы пробовали менять голос не программно, а в панельке управления или что там у них за педали?
0
undiabler
4 / 4 / 0
Регистрация: 25.07.2012
Сообщений: 28
24.01.2013, 00:37  [ТС] #3
В том то и дело что никакой панельки нету, точнее в стандартных настройках установленный язык даже не отображается так как этот движок по сути "левый". Покурив мануалы по подключению новых языков я нашел лишь ту информацию что по сути данный код просматривает лишь определенные ветки реестра в которых как и оказалось "алены" нет и в помине.

В приложении кинул нагугленный екзешник который работает на 100%. Если б найти к нему исходники я думаю проблема бы решилась сама собой. Он без лишних телодвижений сразу выдал мне в списке алену, и можно на русском синтезировать.
0
Вложения
Тип файла: rar SpeechAPI.rar (424.8 Кб, 138 просмотров)
Nikomnid
5 / 5 / 2
Регистрация: 10.01.2015
Сообщений: 32
30.05.2016, 18:30 #4
undiabler, Привет! Понимаю тема уже старая, но все-же выкладываю сюда для будущих поколений.
Это мой класс который позволяет упрощенно рулить sapi, т.е. задавать движок, и язык на котором будет воспроизводиться текст. Если установлен движок с русским языком, то и русский текст тоже будет говорить .
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// все что нужно для sapi
#include <sapi.h>
#pragma comment(lib,"sapi.lib")
#include <sphelper.h>
#define _ATL_APARTMENT_THREADED 
#include <atlbase.h> 
extern CComModule _Module;
#include <atlcom.h>
//--------------------------
 
 
#include <string>
 
using namespace std;
 
 
 
// Класс упрощеного использования SAPI
class sapi
{
private:
    // Строка что произностить
    string str;
    // Язык "409" или "419" подробнее в SPCAT_VOICES
    string Lang;
    // Производитель движка Vendor подробнее в SPCAT_VOICES
    string Engine;
    bool *Nul;
    bool error;
public:
    sapi() : str(""), Lang(""), Engine(""), Nul(NULL), error(false) {};
 
    // метод задачи параметров
    bool speak(string s, string Lg, string Eg, bool voice);
 
    // метод воспроизведения
    bool voice();
 
    // перегруженный оператор ввода параметров с клавиатуры.
    friend istream& operator>> (istream &speak, sapi voice);
 
    ~sapi();
};
 
 
 
sapi::~sapi()
{
    str = "";
    Lang = "";
    Engine = "";
    if (Nul != NULL) delete[]Nul;
    error = false;
}
 
 
// перегруженный оператор ввода параметров с клавиатуры. Интерфейс std::cin>>sapi class
istream& operator>> (istream &speak, sapi voice)
{
    speak >> voice.str;
    speak >> voice.Lang;
    voice.Lang = (string)"Language=" + voice.Lang;
    speak >> voice.Engine;
    voice.Lang = (string)"Vendor=" + voice.Engine;
    voice.Nul = new bool[2];
    if (voice.Lang == "Language=") voice.Nul[0] = true; else   voice.Nul[0] = false;
    if (voice.Engine == "Vendor=") voice.Nul[1] = true; else   voice.Nul[1] = false;
    if (voice.str == "") voice.error = false; else voice.error = true;
    return speak;
}
 
// метод воспроизведения, перед использованием вызвать метод speek(,,,false) иначе return false
// return true если все ок :)
bool sapi::voice()
{
    if (error)
    {
        ISpVoice * pVoice = NULL;
        CComPtr<ISpObjectToken>        cpVoiceToken;
 
        if (FAILED(::CoInitialize(NULL)))
            return false;
        HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
        if (SUCCEEDED(hr))
        {
            if ((!Nul[0]) && (Nul[1]))
                hr = SpFindBestToken(SPCAT_VOICES,
                    (LPCWSTR)wstring(Lang.begin(), Lang.end()).c_str(),
                    L"Vendor=Microsoft", &cpVoiceToken);
            if ((!Nul[1]) && (Nul[0]))
                hr = SpFindBestToken(SPCAT_VOICES,
                    L"Language=409",
                    (LPCWSTR)wstring(Engine.begin(), Engine.end()).c_str(), &cpVoiceToken);
            if ((!Nul[0]) && (!Nul[1]))
                hr = SpFindBestToken(SPCAT_VOICES,
                    (LPCWSTR)wstring(Lang.begin(), Lang.end()).c_str(),
                    (LPCWSTR)wstring(Engine.begin(), Engine.end()).c_str(),
                    //L"Language=419", L"Vendor=ELAN Speech",
                    &cpVoiceToken);
            if ((Nul[0]) && (Nul[1]))
                hr = SpFindBestToken(SPCAT_VOICES, L"Language=409", L"Vendor=Microsoft", &cpVoiceToken);
 
            hr = pVoice->SetVoice(cpVoiceToken);
            hr = pVoice->Speak((LPCWSTR)wstring(str.begin(), str.end()).c_str(), 0, NULL);
            pVoice->Release();
            pVoice = NULL;
        }
        ::CoUninitialize();
        return true;
    }
    else return false;
}
 
 
// метод задачи параметров, если использовать в месте с воспроизведением то вызвать метод speek(,,,true).
// Интерфейс
//speak(string "что говорить", string "язык 409(англ) или 419(рус)", string "движок", bool (true(сейчас сказать) или false(потом сказать)) вызов метода voice).
// return true если все ок :)
bool sapi::speak(string s, string Lg, string Eg, bool voice)
{
    str = s;
    Lang = (string)"Language=" + Lg;
    Engine = (string)"Vendor=" + Eg;
    Nul = new bool[2];
    if (Lang == "Language=") Nul[0] = true; else   Nul[0] = false;
    if (Engine == "Vendor=") Nul[1] = true; else   Nul[1] = false;
    if (str == "") error = false; else error = true;
    if (voice) return sapi::voice(); else return error;
}
P.S. Тестировалось на Николае от ELAN Speech
0
undiabler
4 / 4 / 0
Регистрация: 25.07.2012
Сообщений: 28
30.05.2016, 19:09  [ТС] #5
Спасибо. Думаю кому-то пригодится.

Если кому-то интересно, я в свое время не найдя ответа и при отсутствии желания копаться в дебрях системы где этот движок потерялся сделал намного проще - подключил гугл апи по синтезу речи из онлайн переводчика. Решение 100% рабочее и рабочее достаточно добротно.

Существенный минус - необходимость наличия интернета =)
0
30.05.2016, 19:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2016, 19:09
Привет! Вот еще темы с ответами:

распознавание русской речи на C# - C#
ФОРУМЧАНЕ поделитесь опытом и знаниями кто что знает о распознавании русской речи, любая информация будет полезна, итак в .net есть...

Синтез речи по нотам - Искусственный интеллект
Здравствуйте. Одна музыкантша показала мне партитуру воспроизводящую русскую речь. Не помню о чем там говорилось, но девушка...

Распознование и синтез речи - Искусственный интеллект
Есть задание сделать распознование и синтез речи робота. Есть кто занимался подобным или занимается? Подскажите, пожалуйста, на каких...

Реализовать синтез речи - C#
Народ выручайте , ищу сегодня целый день информацию так и нечего не работает . Суть в том что хочу сделать синтез речи , но не стандартным...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru