Параметры баланса/панорамирования SAPI Audio

Я изучаю варианты для двух независимых, одновременно работающих приложений Win32 на платформе Windows 7 Embedded для вывода звука на соответствующие каналы устройства вывода звука (т.е. приложение «A» использует левый канал, а приложение «B» использует правый) .

В этом случае приложение A — это ранее существовавшее приложение C++, использующее механизм SAPI TTS. (Приложение B еще не написано).

В то время как интерфейс SAPI предоставляет свойство объема, похоже, не предусмотрена возможность назначения настройки панорамирования/баланса.

Я попробовал Virtual Audio Cable, думая, что это может позволить подключиться к левому или правому каналу, но это не так.

Любые предложения, программные или иные?


person David    schedule 28.10.2015    source источник


Ответы (1)


SAPI на самом деле не выполняет большую обработку звука для синтеза речи, кроме громкости, высоты тона и скорости. Даже с учетом сказанного я сталкивался с голосами SAPI, которые даже не реализуют эти три вещи.

Вы, вероятно, захотите вывести свою синтезированную речь в виде файла .wav и обработать этот вывод с помощью другой библиотеки для панорамирования.

Вот некоторый код, который покажет вам, как выводить данные в файл .wav с помощью SAPI на C++.

#include <sapi.h>
#include <sphelper.h>
#include <iostream>

int main(int argc, char* argv[])
{

    HRESULT hr = S_OK;
    CComPtr<ISpObjectToken> cpVoiceToken;
    CComPtr<ISpVoice> cpVoice;
    CSpStreamFormat cAudioFmt;
    CComPtr<ISpStream> cpStream;

    ::CoInitialize(NULL);

    if(SUCCEEDED(hr))
        hr = cAudioFmt.AssignFormat(SPSF_22kHz16BitMono);
    if(SUCCEEDED(hr))
        hr = SPBindToFile(L"E:\\fileName.wav", SPFM_CREATE_ALWAYS, &cpStream, &cAudioFmt.FormatId(), cAudioFmt.WaveFormatExPtr());
    if(SUCCEEDED(hr))
        hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
    if(SUCCEEDED(hr))
        cpVoice->SetOutput(cpStream, TRUE);
    if(SUCCEEDED(hr))
        hr = cpVoice->Speak(L"My spoken text goes here", SPF_DEFAULT, NULL);

    cpStream->Close();
    cpStream.Release();
    cpVoice.Release();
    ::CoUninitialize();

    std::printf("%s", "Press any key to continue...");
    std::getchar();
}
person Lesley Gushurst    schedule 28.10.2015
comment
Спасибо - это подход, который я не рассматривал, но, возможно, это единственный путь вперед. - person David; 29.10.2015