2015-03-29 4 views
0
#include <windows.h> 
#include <mmsystem.h> 
#include <iostream> 
#include <string.h> 
#include <fstream> 

char *sounds[] = {"d.wav","ai.wav","v.wav","i.wav"}; 

int main() 
{ 
    char input[20]; 
    int k; 
    int i = 0; 
    std::cin >> input; 
    while (input[i]) 
    { 
     k = input[i] - 'a'; 
     PlaySound(TEXT(sounds[k]), NULL, SND_ASYNC); 
    } 
system("pause"); 
} 

В попытке сделать программу для преобразования текста в речь я столкнулся с этой проблемой.C++ Text-To-Speech undefined errors

int k, считывает ввод и воспроизводит файл .wav, связанный с прочитанной строкой. Проблема возникает от PlaySound(TEXT(sounds[k]), NULL, SND_ASYNC);. Ошибки считаются: (IntelliSense: идентификатор «Lsounds» не определен) и (ошибка C2065: «Заряды»: необъявленный идентификатор). Однако, похоже, что это означает одно и то же, я не могу найти источник проблемы или что ее вызывает. Как было/не было никаких ограничений и как я его исправить?

+0

Где вы инкремент «я» в цикле в то время? Ах .. может быть, в макросе? –

+0

В этом есть много проблем, не в последнюю очередь из-за того, что этот подход TTS не использовался в течение 25 лет, по уважительной причине. У каждой крупной ОС уже есть готовые решения, а настоящие - не такие. Также файлы «wav»:/ – Blindy

+0

Да, SAPI - пример того, что приходит встроенным. Легкий способ решить эту конкретную проблему - не пытаться поддерживать старые системы, используя утилиты, связанные с TCHAR, и передавать широкие строки в функции winapi. – chris

ответ

0

Это TEXT(sounds[k]), что вызывает проблемы. TEXT() - это макрос, который расширяется до L, за которым следует то, что вы вводите внутри, так что это эквивалент Lsounds[k], следовательно, ошибка.

+0

Это имеет смысл. Спасибо. Любая идея, как я могу обойти это? –

+0

Не знаю, чего вы пытаетесь достичь здесь. Вроде бы. – Blindy

0

API PlaySound используется для воспроизведения файлов WAVE. Вы должны использовать SAPI COM интерфейс для TTS:

CComPtr <ISpVoice> cpVoice; 

//Create a SAPI Voice 
HRESULT hr = cpVoice.CoCreateInstance(CLSID_SpVoice); 

if(SUCCEEDED(hr)) 
{ 
    cpVoice->Speak(L"Hello World", SPF_DEFAULT, NULL); 
} 
+0

Я использовал что-то подобное раньше, но с этим я не могу использовать голос, сделанный на заказ. PlaySound позволяет мне использовать 44.wav-файлы, содержащие все звуковые звуки. Могу ли я сделать что-то подобное с SAPI? Конечная цель - использовать пользовательский голос. –

+0

Вы можете создать собственный голос в SAPI. Поиск в MSDN по этому вопросу –

+0

. Спасибо вам за помощь. –