2010-05-07 7 views
5

मैं यह पता लगाने की कोशिश कर रहा हूं कि विंडोज एसएपीआई 5.1 का उपयोग कर मेमोरी बफर में टेक्स्ट कैसे बोलें, लेकिन अभी तक कोई सफलता नहीं है, भले ही ऐसा लगता है कि यह काफी सरल होना चाहिए।सी ++ माइक्रोसॉफ्ट एसएपीआई: विंडोज़ टेक्स्ट-टू-स्पीच आउटपुट को मेमोरी बफर में कैसे सेट करें?

एक .wav फ़ाइल में संश्लेषित भाषण स्ट्रीम करने के an example है, लेकिन मेमोरी बफर में इसे स्ट्रीम करने के तरीके के बारे में कोई उदाहरण नहीं है।

अंत में मुझे 16 केएचजेड 16-बिट छोटे-एंडियन पीसीएम प्रारूप में एक char * सरणी में संश्लेषित भाषण की आवश्यकता है। वर्तमान में मैं एक temp .wav फ़ाइल बना रहा हूं, वहां भाषण आउटपुट रीडायरेक्ट करता हूं, फिर इसे पढ़ता हूं, लेकिन ऐसा लगता है कि यह एक बेवकूफ समाधान है।

कोई भी जानता है कि यह कैसे करें?

धन्यवाद!

+0

आप यह करने के लिए प्रबंधन कैसे किया? – Yashasvi

उत्तर

0

क्या आप जानते हैं कि स्मृति-मैप की गई फ़ाइल कैसे बनाएं? आप देख सकते हैं कि ISpStream इससे जुड़ा होगा या नहीं।

6

आईएसपीस्ट्रीम :: सेटबेसस्ट्रीम देखें। यहां एक छोटा सा सहायक है:

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; 
} 
+0

एरिक, एचजीएलबीएएल मेमोरी हैंडल प्राप्त करने के लिए ग्लोबल अलाक कॉल के लिए आपको जिस आकार की आवश्यकता है, उसे आप कैसे ढूंढ सकते हैं? मुझे लगता है कि यह कितना भाषण बोली जाती है, इस पर निर्भर करता है, लेकिन आप इसे कैसे ढूंढ सकते हैं? –

+0

आपको इसकी आवश्यकता नहीं है। :: CreateStreamOnHGlobal द्वारा प्रबंधित स्मृति स्ट्रीम आवश्यकतानुसार स्मृति को पुन: आवंटित करेगी। –

+0

मैंने इस उदाहरण को एक बफर में स्ट्रीमिंग भाषण के कार्यान्वयन के आधार के रूप में उपयोग किया। लेकिन जब आईएसटी स्ट्रीम ऑब्जेक्ट से पढ़ते हैं तो मुझे हमेशा शून्य बाइट्स पढ़ते हैं। स्ट्रीम ऑब्जेक्ट को देखते हुए, बाइट लिखे गए थे (स्ट्रीम :: स्टेट का उपयोग करके)। डेटा प्राप्त करने के लिए मुझे ISTream :: LockRegion का उपयोग करने की आवश्यकता है? – pettersson

1

मैंने इसे आईएसपीस्ट्रीम का उपयोग करके पूरा किया। आईएसपी स्ट्रीम में सेट करने के लिए आईएसपीस्ट्रीम के सेटबेसस्ट्रीम फ़ंक्शन का उपयोग करें और उसके बाद ispvoice के ispvoice के आउटपुट को सेट करें।

यहाँ मेरे कार्य समाधान है अगर किसी को भी यह चाहता है:

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

संबंधित मुद्दे