社区
C++ Builder
帖子详情
求教:怎样抓实时语音,通过连接到电脑的语音输入设备(如麦克风)抓录入语音???
gqxs
2001-07-06 11:54:22
...全文
378
6
打赏
收藏
求教:怎样抓实时语音,通过连接到电脑的语音输入设备(如麦克风)抓录入语音???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gqxs
2001-07-06
打赏
举报
回复
佩服
wjzhuang
2001-07-06
打赏
举报
回复
http://www.torry.net/samples_graphics.htm
delphi的代码
我不懂电脑
2001-07-06
打赏
举报
回复
1.语音的采集和播放。
本软件中要把语音直接转换为数据,放在内存中,而不是存为语音文件,而且播放语音时,也是直接播放语音数据,而不是播放语音文件。这样的好处前面已经提到,即省略了读写硬盘的费时操作,提高了语音通话的实时性。
要完成上述语音操作,编程语言中提供的容易使用的高级的多媒体语音函数是无法胜任的,只能用一些底层的语音函数来实现,这一类函数和结构的名字都以"wave"作为前缀。
下面简要分析录音和放音的流程,考虑到两着的处理和流程基本上是类似的,本文就只以录音为例来分析,如图三为录音流程。录音的准备工作主要是三点,打开录音设备,获得录音句柄,指定录音格式,分配若干用于录音的内存,内存的大小和数量下文将进一步分析。开始录音时,先将所有内存块都提供给录音设备用来录音,录音设备就会依次将语音数据写入内存,当一块内存写满,录音设备就会发一个Window 消息MM_WIM_DATA给相应的窗口,通知程序作相关的处理,这时程序通常的处理是把内存中的数据进行复制,如写入文件等,在此我们的处理是把数据进行压缩和网络发送,然后把内存置空,返还给录音设备进行录音,这样就形成一个循环不息的录音过程。结束录音时就释放所有内存块,关闭录音设备。
图三 录音流程
以录音为例,关键的录音函数和顺序如下:
WAVEFORMATEX waveformat;
waveformat.wFormatTag=WAVE_FORMAT_PCM;
waveformat.nChannels=1;
waveformat.nSamplesPerSec=8000;
waveformat.nAvgBytesPerSec=16000;
waveformat.nBlockAlign=2;
waveformat.cbSize=0;
waveformat.wBitsPerSample=16; //指定录音格式
int res=waveInOpen(&m_hWaveIn,WAVE_MAPPER, &waveformat, (DWORD)m_hWnd,0L,CALLBACK_WINDOW); //打开录音设备
waveInPrepareHeader(m_hWaveIn,m_pWaveHdr[i],sizeof(WAVEHDR)); //准备内存块录音
waveInAddBuffer(m_hWaveIn,m_pWaveHdr[i],sizeof(WAVEHDR)); //增加内存块
waveInStart(m_hWaveIn);//开始录音
waveInStop(m_hWaveIn); //停止录音
waveInReset(m_hWaveIn); //清空内存块
waveInClose(m_hWaveIn); //关闭录音设备
在录音和放音的程序处理中,要特别注意两点。一个是分配的内存的大小和数量。内存的大小与IP电话中语音的连续性和延时性有直接关系,内存越大,则语音的连续性越好,但延时性越差,反之,内存越小,则语音的延时性越小,但连续性越差,所以要权衡利弊,取一个折衷量,这就需要反复实验。根据作者的实验,大约每个内存块录音的时间长度取0.1秒比较合适,具体的大小与采用的语音格式有关。内存的数量则与内存的大小和对每个内存的录音数据的处理时间长短有关,一定要保证在录音过程中,录音设备至少有一块内存可供录音,也就是说录满的内存要及时返回,使得循环能够顺利进行。由此可知,内存大,分配的数量就可以少,对每个内存的录音数据的处理时间短,分配的数量就可以少,反之,分配的数量就要多。当然可以分配足够多的数量,但是太多则耗费资源,降低了程序的效率。根据作者的实验,大约所有的内存块录音的时间长度和有0.5秒就足够了,也就是说,如果每个内存块录音时间长度为0.1秒,则可以分配5个内存块。
程序中还有特别重要的一点是语音设备的Window消息的相应,通过语音设备发送的一系列消息,如MM_WIN_OPEN录音设备打开消息,MM_WIM_CLOSE录音设备关闭消息等,我们可以响应语音设备的打开,关闭,开始录音和放音,停止录音和放音,录音时一个内存块录满,放音时一个内存块放完等各种事件,来进行相关的处理。需要注意的是这些消息在VC的ClassWizard类工具的消息序列中是看不到的,需要手工编辑消息响应宏和代码。
我不懂电脑
2001-07-06
打赏
举报
回复
你可以用wave这组Api来实现。
luhongjun
2001-07-06
打赏
举报
回复
录音的主要实现部分.
void TForm1::RecordWave(long time,char * filename)
{
MCI_OPEN_PARMS mciOpen;
MCI_RECORD_PARMS mciRecord;
MCI_SAVE_PARMS mciSave;
DWORD flags;
long DeviceID;
StatusBar1->Panels->Items[0]->Text="Recording...";
mciOpen.lpstrDeviceType="waveaudio";
mciOpen.lpstrElementName="";
flags=MCI_OPEN_ELEMENT¦MCI_OPEN_TYPE;
mciError(mciSendCommand(0,MCI_OPEN,flags,DWORD(&mciOpen)),"OpenWave");
DeviceID=mciOpen.wDeviceID;
mciRecord.dwTo=time;
flags=MCI_TO¦MCI_WAIT;
mciError(mciSendCommand(DeviceID,MCI_RECORD,flags,DWORD(&mciRecord)),"RecordWave");
StatusBar1->Panels->Items[0]->Text="Finished...";
mciSave.lpfilename=filename;
flags=MCI_SAVE_FILE¦MCI_WAIT;
mciError(mciSendCommand(DeviceID,MCI_SAVE,flags,DWORD(&mciSave)),"SaveToFile");
mciError(mciSendCommand(DeviceID,MCI_CLOSE,flags,DWORD(NULL)),"Close");
}
错误处理:
bool TForm1::mciError(long error, char *caller)
{
char msg[100];
if (error!=0){
mciGetErrorString(error,msg,100);
Application->MessageBox(msg,caller,ID_OK);
return true;
}
return false;
}
调用的例子:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
SaveDialog1->Filter="WaveAudio files (*.wav)¦*.Wav";
if (SaveDialog1->Execute())
RecordWave(StrToInt(Edit1->Text),SaveDialog1->FileName.c_str());
}
gqxs
2001-07-06
打赏
举报
回复
下周一我来结帐!
数据处理救星降世Power Query
0/ Excel数据处理新利器来了,准备好了吗? 1/ 比网红函数VLOOKUP还全面的功能。——查(查询) 2/ 取其精华,去其糟粕。...——聚(聚合) 9/ 我自己的难题自己造函数,不
求教
别人。——技法(自定义函数)
java
语音
输入
_
求教
:javaWeb,添加
语音
输入
的功能实现方法
//
语音
识别$rootScope.startRecognize=function(){varspeech;varoptions={};//
语音
识别参数,用于控制
语音
引擎的各种技术参数options.engine='iFly';options.userInterface='false';text="";plus.speech.startRecognize(options,...
博图只能通过地址相同
设备
找到plc_小白
求教
:博途v13无法
连接
s7-1200,显示"在网络上未找到任何
设备
"...
展开全部可能需要清除程序后才能
连接
,另外一种可能是,软件环境有问题,驱动部分未正常加载,博图任何一个版62616964757a686964616fe78988e69d8331333433636131本目前都没有S7-1200的仿真功能,可以将S7-1200的机型改为1500,从而变相地实现仿真,不过,S7-1200的专用指令将不能模拟。西门子1200系列有CM1241模块,在博途V10.5以上的版...
boseqc35能不能连
电脑
_
求教
boseqc35如何
连接
win10
电脑
把耳机上开关小按钮拨到最右,到耳机一直提示ready to paired,然后打开蓝牙,把之前
电脑
自动
连接
到的耳机的断掉再重新配对一次,就连上了。求助,BOSE qc35
连接
电脑
音频线
连接
:如果
电脑
是DELL一体机,WIN10系统, 默认自带扬声器输出控制面版>硬件和声音>DELL AUDIO>选择扬声器输出BOSE QC30如何
连接
电脑
?win10是可以直接使用的。win7的使...
求教
:腾讯云数据库MySQL,如何
连接
并用来开发APP
1. 是否可以写个app,直接远程
连接
?然后操作增改删等等。我在学javascript。2. 还是要搞个服务器
连接
数据库?
C++ Builder
13,824
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章