现在我需要将客户端(Windows Form)用户说的声音录进电脑,存入缓冲区,然后通过web service传到服务器。同时接受服务器返回的数据并在客户端播放。这个我已经实现了,使用Microsoft.DirectX.DirectSound和Microsoft.DirectX问题来了录音的过程中,如果用户超过指定时间没有说话,必须中止客户端与服务器之间的传输,并且通知服务器传输的数据长度,服务器会处理这一段落的语音数据并返回处理结果,怎样才能实现“超过一定时间没有说话”的通知呢?
备注:
实现语言:C#
备注:
实现语言:C#
这句话就是指用户可能停顿了几秒钟,甚至说了一句就一直不说了,我希望在不说的时候可以中止声音传输,等他再说时再启动。
另外一点,我的软件其实是做同声传译,声音送到服务器要进行翻译处理,不过语音引擎需要知道每次翻译多长的句子,还要知道长度。
所以我才想到此对策,就是通过一定时间的“Timeout"来判断这句话说完了,然后通知服务器“可以翻译这句话了”。等用户再说下一句时继续录。
慢慢试,找出一个值,认定当差异度小于这个值就是没人说话 大于这个值就是有人说话。这种统计方式只是一种。也可以采用其他的方式。具体用什么算法,看你的需求,运行环境了。
format.FormatTag = WaveFormatTag.Pcm; // PCM
format.SamplesPerSecond = 16000; // 16KHz
format.BitsPerSample = 16; // 16Bit
format.Channels = 1; // Mono
format.BlockAlign = (short)(format.Channels * (format.BitsPerSample / 8));
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;
return format;wav的规格如上
从不说话,到说话,发现平均值变大了!或许?我可以用这个来判断?
107.149
108.54925
108.337
106.39975
104.9475
112.34
106.4685
109.36325
105.14925
106.177
110.10675
101.84175
110.8665
108.03225
105.93775
109.5185
102.70875
107.58275
107.56925
106.948
106.39475
109.02725
107.921
109.0515
107.19275
111.62675
104.7495
105.77075
109.8325
104.68225
107.74575
104.8825
108.9085
111.47375
126.61375
120.449
130.38475
123.3895
123.319
115.018
124.5095
130.238
130.523
128.995
131.10025
126.289
126.4885
129.4535
128.46925
125.84575
124.65525
108.8315
104.23025
123.765
119.1755
132.3605
134.504
131.00875
121.89225
132.863
131.67775
134.45825
127.8435
122.0265
113.935
88.54475
105.075
| 单声道 |--------------------------------------------------------
| 16bit量化 | 声道0 | 声道0 | 声道0 | 声道0 |
| | (低位字节) | (高位字节) | (低位字节) | (高位字节) |