С++ неопределенные ошибки преобразования текста в речь

#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");
}

При попытке сделать программу преобразования текста в речь я столкнулся с этой проблемой.

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


person gfdgfd gfdgfd    schedule 29.03.2015    source источник
comment
Где вы увеличиваете «i» в цикле while? О.. может в макросе?   -  person 2785528    schedule 29.03.2015
comment
В этом есть масса проблем, не в последнюю очередь из-за того, что этот подход TTS не использовался в течение 25 лет по уважительной причине. Каждая крупная ОС уже поставляется с готовыми решениями, причем настоящими, а не такими. Также wav-файлы :/   -  person Blindy    schedule 29.03.2015
comment
Да, SAPI — это пример того, что встроено. Простой способ решить эту конкретную проблему — не пытаться поддерживать старые системы с помощью утилит, связанных с TCHAR, а вместо этого передавать расширенные строки в функции winapi.   -  person chris    schedule 29.03.2015
comment
Да, старый метод, но попытка была сделать программу TTS с собственным голосом. Я немного возился с SAPI, но не смог найти метод, который позволил бы мне использовать собственный голос. .wav относится к одному из 44 фонических звуков, которые я создал и отредактировал. Кто-нибудь из вас знает место, куда я мог бы пойти, чтобы помочь узнать/найти более пиратские способы достижения этого?   -  person gfdgfd gfdgfd    schedule 29.03.2015


Ответы (2)


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

person Blindy    schedule 29.03.2015
comment
Это имеет смысл. Спасибо. Любая идея, как я мог бы обойти это? - person gfdgfd gfdgfd; 29.03.2015
comment
Понятия не имею, чего вы пытаетесь достичь здесь. Вроде вообще. - person Blindy; 29.03.2015

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

CComPtr <ISpVoice>  cpVoice;

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

if(SUCCEEDED(hr))
{
  cpVoice->Speak(L"Hello World",  SPF_DEFAULT, NULL);
}
person Andrew Komiagin    schedule 29.03.2015
comment
Раньше я использовал что-то подобное, однако с этим я не могу использовать сделанный на заказ голос. PlaySound позволяет мне использовать 44 файла .wav, которые содержат все фоновые звуки. Могу ли я сделать что-то подобное с SAPI? Конечная цель — использовать собственный голос. - person gfdgfd gfdgfd; 29.03.2015
comment
Вы можете создать собственный голос в SAPI. Поищите в MSDN по этому вопросу - person Andrew Komiagin; 29.03.2015
comment
Сделаю. Спасибо вам за помощь. - person gfdgfd gfdgfd; 29.03.2015