ATL COM组件 SPEECH5.0语音播放和识别(文本到语音、语音到文本)

原创 2004年10月14日 21:19:00

基于SPEECH5.0的语音组件,需要相应开发包联合编译
// speechX.h : CspeechX 的声明

#pragma once
#include "resource.h"       // 主符号


// IspeechX
[
 object,
 uuid("25246261-2CD8-4D9C-AC51-D5184D1572C4"),
 dual, helpstring("IspeechX 接口"),
 pointer_default(unique)
]
__interface IspeechX : IDispatch
{
 [id(1), helpstring("方法Read")] HRESULT Read(BSTR text);
 [propget, id(2), helpstring("属性 HearedWord")] HRESULT HearedWord([out, retval] BSTR* pVal);
 [id(3), helpstring("方法StartH")] HRESULT StartH(void);

 [propget, id(4), helpstring("属性 IsHearing")] HRESULT IsHearing([out, retval] BOOL* pVal);
};

 

// CspeechX

[
 coclass,
 threading("apartment"),
 vi_progid("speech.speechX"),
 progid("speech.speechX.1"),
 version(1.0),
 uuid("D72932F4-000C-4EF7-BAD4-FC5F616CD9E3"),
 helpstring("speechX Class")
]
class ATL_NO_VTABLE CspeechX :
 public IspeechX
{

private:
  //朗读
  CComPtr<ISpVoice>   m_cpVoice;
  //上下文 
  CComPtr<ISpRecoContext> cpRecoCtxt;
  //语法分析
     CComPtr<ISpRecoGrammar> cpGrammar;
   //语音结果  
     CComPtr<ISpRecoResult> cpResult;
    
  //听到的单词
  _bstr_t m_hear;
     //朗读的单词
  _bstr_t m_text;
  //退出接收标志
  BOOL m_quitflag;
  //结果
  HRESULT                 hr;
    public:
 CspeechX()
 {
     
 
      m_hear=L"对话开始";
      m_quitflag=false;

 }


 DECLARE_PROTECT_FINAL_CONSTRUCT()

 HRESULT FinalConstruct()
 {
  return S_OK;
 }
 
 void FinalRelease()
 {
     m_cpVoice.Release();
     cpRecoCtxt.Release();
     cpGrammar.Release();
     cpResult.Release();
 }
protected:
 inline HRESULT BlockForResult (ISpRecoContext * pRecoCtxt, ISpRecoResult ** ppResult);


public:

 STDMETHOD(Read)(BSTR text);
 HRESULT read(WCHAR* path);
 STDMETHOD(get_HearedWord)(BSTR* pVal);
 
 STDMETHOD(StartH)(void);

 STDMETHOD(get_IsHearing)(BOOL* pVal);
};
------------------------------------------
// speechX.cpp : CspeechX 的实现

#include "stdafx.h"
#include "speechX.h"
#include "sphelper.h"

// CspeechX


STDMETHODIMP CspeechX::Read(BSTR text)
{
   m_text=text;
      read( (WCHAR *)m_text );
      //释放BSTR,调试时误用
      SysFreeString(text);
  return S_OK;
}

STDMETHODIMP CspeechX::StartH(void)
{
   m_quitflag=true;
   hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);
 
  //设置上下文      
            if (cpRecoCtxt &&
                SUCCEEDED(hr = cpRecoCtxt->SetNotifyWin32Event()) &&
                SUCCEEDED(hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION))) &&
                SUCCEEDED(hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL)) &&
                SUCCEEDED(hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar)) &&
                SUCCEEDED(hr = cpGrammar->LoadDictation(NULL, SPLO_STATIC)) &&
                SUCCEEDED(hr = cpGrammar->SetDictationState(SPRS_ACTIVE)))
            {
                                           
            if (SUCCEEDED(hr = BlockForResult(cpRecoCtxt, &cpResult)))
            {
                    cpGrammar->SetDictationState( SPRS_INACTIVE );

                    WCHAR* dstrText;

                    if (SUCCEEDED(cpResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE,
                                                    TRUE, &dstrText, NULL)))
                    {   m_hear= dstrText;
   
                        cpResult.Release();
                    }
                    
    cpGrammar->SetDictationState(SPRS_ACTIVE);

                }
           
     cpRecoCtxt.Release();
              cpGrammar.Release();
              cpResult.Release();
   }

    m_quitflag=false;
  
 return S_OK;
}


HRESULT CspeechX::read(WCHAR* path)
{
 

    hr = m_cpVoice.CoCreateInstance( CLSID_SpVoice );
    m_cpVoice->Speak(path, 0, NULL);
    m_cpVoice.Release();

 

 return S_OK;
}

//收到信息接口
STDMETHODIMP CspeechX::get_HearedWord(BSTR* pVal)
{
 * pVal=m_hear;

 return S_OK;
}

 


//将上下文填充进结果
inline HRESULT CspeechX::BlockForResult(ISpRecoContext * pRecoCtxt, ISpRecoResult ** ppResult)
{
    HRESULT hr = S_OK;
 CSpEvent event;

    while (SUCCEEDED(hr) &&
           SUCCEEDED(hr = event.GetFrom(pRecoCtxt)) &&
           hr == S_FALSE)
    {
        hr = pRecoCtxt->WaitForNotifyEvent(INFINITE);
    }

    *ppResult = event.RecoResult();
    if (*ppResult)
    {
        (*ppResult)->AddRef();
    }

    return hr;
}

 

 


STDMETHODIMP CspeechX::get_IsHearing(BOOL* pVal)
{
 * pVal=m_quitflag;

 return S_OK;
}

C#将文本用语音朗读

在C#中文字语音朗读有三种方法,下面暂介绍其中一个方法。在项目中引用System.Speech,具体方法为右键点击项目 > 添加引用 > .Net > 找到System.Speech点击确定。...
  • qq_34905123
  • qq_34905123
  • 2017年01月05日 10:23
  • 3860

QT实现文本转语音

转自IntoTheWild的博客:http://blog.sina.com.cn/iuhzzy 最近写一个QT程序时需要用到文本转语音播放,在网上找了很多关于QT调用微软tts的资料,在这总结一下其...
  • love_apartment
  • love_apartment
  • 2017年02月06日 16:27
  • 1503

文本转语音

TTS引擎,基于文本驱动的语音发声,核心的应用程序接口是ISpVoice 在有些精简的操作系统下,可能TTS组件无法正常使用,下载 http://download.csdn.net/detail/...
  • windows_nt
  • windows_nt
  • 2014年02月25日 22:27
  • 2007

QT程序文本转语音播放

转自IntoTheWild的博客:http://blog.sina.com.cn/iuhzzy 最近写一个QT程序时需要用到文本转语音播放,在网上找了很多关于QT调用微软tts的资料,在这总结一下其...
  • Helloo_jerry
  • Helloo_jerry
  • 2017年12月01日 21:13
  • 186

Windows下 使用Python 3 调用讯飞 TTS 引擎实现文本转语音

使用前将讯飞SDK bin下的文件及文件夹复制到当前文件夹下。 py -3 ttsdemo.py #! /usr/bin/env python # coding=utf-8 # python vers...
  • onestab
  • onestab
  • 2017年09月27日 10:50
  • 2536

在网页上通过JS实现文本的语音朗读

摘要: 语音合成:也被称为文本转换技术(TTS),它是将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的口语输出的技术。 1、接口定义 http://tts.baidu.c...
  • mixi9760
  • mixi9760
  • 2017年07月27日 16:21
  • 2198

Android文字转语音

虽然视觉上的反馈通常是给用户提供信息最快的方式,但这要求用户把注意力设备上。当用户不能查看设备时,则需要一些其他通信的方法。Android提供了强大的文字转语音Text-to-Speech,TTS A...
  • liyuanjinglyj
  • liyuanjinglyj
  • 2015年05月29日 20:39
  • 8303

C++朗读中文文本

C++朗读中文文本
  • daoming1112
  • daoming1112
  • 2017年08月25日 10:19
  • 225

Java文本转语音

package com.xh.speak; import java.io.IOException; import com.jacob.activeX.ActiveXComponent; impor...
  • qq_24949727
  • qq_24949727
  • 2016年03月09日 17:28
  • 6734

android 暂停和继续第三方应用的语音播放

原文地址:http://blog.csdn.net/franksunny/article/details/12224551 暂停和继续第三方应用的语音播放   很多语音聊...
  • YanLai20
  • YanLai20
  • 2015年08月14日 14:56
  • 604
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ATL COM组件 SPEECH5.0语音播放和识别(文本到语音、语音到文本)
举报原因:
原因补充:

(最多只允许输入30个字)