Frage C ++ Microsoft SAPI: Wie setze ich die Text-zu-Sprache-Ausgabe von Windows auf einen Speicherpuffer?


Ich habe versucht, herauszufinden, wie man einen Text mit Windows SAPI 5.1 in einen Speicherpuffer "spricht", aber bisher keinen Erfolg, obwohl es scheint, dass es ziemlich einfach sein sollte.

Es gibt ein Beispiel Streaming der synthetisierten Sprache in eine WAV-Datei, aber keine Beispiele, wie es in einen Speicherpuffer zu streamen.

Am Ende muss ich die synthetisierte Sprache in einem char * -Array in 16-kHz-16-Bit-Little-Endian-PCM-Format haben. Momentan erstelle ich eine temporäre .wav-Datei, leite die Sprachausgabe dorthin um und lese sie dann, aber es scheint eine ziemlich dumme Lösung zu sein.

Weiß jemand, wie man das macht?

Vielen Dank!


5
2018-05-07 03:47


Ursprung


Antworten:


Schau dir ISpStream :: SetBaseStream an. Hier ist ein kleiner Helfer:

inline HRESULT SPCreateStreamOnHGlobal(
                    HGLOBAL hGlobal,            //Memory handle for the stream object
                    BOOL fDeleteOnRelease,      //Whether to free memory when the object is released
                    const WAVEFORMATEX * pwfex, //WaveFormatEx for stream
                    ISpStream ** ppStream)      //Address of variable to receive ISpStream pointer
{
    HRESULT hr;
    IStream * pMemStream;
    *ppStream = NULL;
    hr = ::CreateStreamOnHGlobal(hGlobal, fDeleteOnRelease, &pMemStream);
    if (SUCCEEDED(hr))
    {
        hr = ::CoCreateInstance(CLSID_SpStream, NULL, CLSCTX_ALL, __uuidof(*ppStream), (void **)ppStream);
        if (SUCCEEDED(hr))
        {
            hr = (*ppStream)->SetBaseStream(pMemStream, SPDFID_WaveFormatEx, pwfex);
            if (FAILED(hr))
            {
                (*ppStream)->Release();
                *ppStream = NULL;
            }
        }
        pMemStream->Release();
    }
    return hr;
}

6
2018-05-11 21:02



Ich habe es mit dem ISpStream erreicht. Verwenden Sie die Setbasestream-Funktion des ispstream, um sie an einen istream zu binden, und setzen Sie dann die Ausgabe von ispvoice auf diesen ispstream.

Hier ist meine Arbeitslösung, wenn jemand will:

https://github.com/itsyash/MS-SAPI-demo


1
2018-06-01 07:03



Wissen Sie, wie Sie eine Memory-Mapped-Datei erstellen? Du könntest sehen, ob ISpStream wird sich daran binden.


0
2018-05-07 04:13