RT.

解决方案 »

  1.   

    不要说带语音功能的猫,就是普通猫也基本上都很少生产了。好的语音猫要100元左右,如已经停产的金网霸。软件嘛,不用写,从我的网站上下个基于TAPI的语音平台就可以了。完全免费,完整功能:
    http://www.bluespace.com.cn/koodoo/download_tapi3.htm
      

  2.   

    谢了楼上的大哥,我看看先,哪位有没有关于TAPI的相关资料呢?小弟找了很久未果
    有的话能否给小弟一份,不胜感谢![email protected]
      

  3.   

    看MSDN或在网上google一下,汗牛充栋。
      

  4.   

    我也有同感。
    所以我的平台除了支持TAPI接口外,还支持市面上流行的语言卡,如Dialogic、东进、三汇等。
    这里都有免费版本可以下载:
    http://www.bluespace.com.cn/koodoo
      

  5.   

    bluesen(善哉) :
    我在你那下载那个平台,可是怎用啊?不知道怎么用。
      

  6.   

    当然有格式要求。我估计你的格式不对。这些语音文件我是测试过的,你下载下来试试:
    http://www.bluespace.com.cn/koodoo/examples_deal.htm
      

  7.   

    我查看过了,我录的文件格式与你的是一样的,用我的那个声音文件在你的程序在也是可以用的,以下我关天播放声音的代码(VC6),烦请各位看看,为何一放机器就会重启呢!short CWaveOut::PlayWave(LPCSTR szFileName)
    {
    //打开波形文件 
    if(!(m_hmmio=mmioOpen((char*)szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF))) 

    //File open Error 
    return -1; 

    //检查打开文件是否是声音文件 
    mmckinfoParent.fccType =mmioFOURCC('W','A','V','E'); 
    if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF)) 

    //NOT WAVE FILE AND QUIT 
    return -2;

    //寻找 ’fmt’ 块 
    mmckinfoSubChunk.ckid =mmioFOURCC('f','m','t',' '); 
    if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)) 

    //Can’t find ’fmt’ chunk 
    return -3;

    //获得 ’fmt ’块的大小,申请内存 
    dwFmtSize=mmckinfoSubChunk.cksize ; 
    m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize)); 
    if(!m_hFormat) 

    //failed alloc memory 
    return -4;

    lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat); 
    if(!lpFormat) 

    //failed to lock the memory 
    return -5;

    if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize) 

    //failed to read format chunk 
    return -6;

    //离开 fmt 块 
    mmioAscend(m_hmmio,&mmckinfoSubChunk,0); 
    //寻找 ’data’ 块 
    mmckinfoSubChunk.ckid=mmioFOURCC('d','a','t','a'); 
    if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK)) 

    //Can’t find ’data’ chunk 
    return -7;

    //获得 ’data’块的大小 
    m_dwDataSize=mmckinfoSubChunk.cksize ; 
    m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ; 
    if(m_dwDataSize==0L) 

    //no data in the ’data’ chunk 
    return -8;

    //为音频数据分配内存 
    lpData=new char[m_dwDataSize]; 
    if(!lpData) 

    //faile 
    return -9;

    if(mmioSeek(m_hmmio,m_dwDataOffset,SEEK_SET)<0) 

    //Failed to read the data chunk 
    return -10;

    m_WaveLong=mmioRead(m_hmmio,lpData, m_dwDataSize); 
    if(m_WaveLong<0) 

    //Failed to read the data chunk 
    return -11;

    //检查音频设备,返回音频输出设备的性能 
    // if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0) 
    // { 
    //Unable to allocate or lock memory 
    // return -12;
    // } 
    //检查音频输出设备是否能播放指定的音频文件 
    if(waveOutOpen(&hWaveOut,(UINT)hID,lpFormat,(DWORD)waveOutProc, NULL, CALLBACK_FUNCTION)!=0) 

    //Failed to OPEN the wave out devices 
    return -13;

    //准备待播放的数据 
    pWaveOutHdr.lpData =(HPSTR)lpData; 
    pWaveOutHdr.dwBufferLength =m_WaveLong; 
    pWaveOutHdr.dwFlags =0; 
    if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0) 

    //Failed to prepare the wave data buffer
    return -14;

    //播放音频数据文件 
    if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0) 

    //Failed to write the wave data buffer 
    return -15;
    }  return 0;}
      

  8.   

    如果是用Modem播放,只能每次播放2K,然后在你的回调函数waveOutProc中处理。此外你的waveOutProc是不是有问题?其实有问题不怕,你可以跟踪解决。可以记录日志,看看究竟在哪一步崩溃的。
      

  9.   

    如果做成控件或者说.DLL的话,我想会方便很多