现在我需要将客户端(Windows Form)用户说的声音录进电脑,存入缓冲区,然后通过web service传到服务器。同时接受服务器返回的数据并在客户端播放。这个我已经实现了,使用Microsoft.DirectX.DirectSound和Microsoft.DirectX问题来了录音的过程中,如果用户超过指定时间没有说话,必须中止客户端与服务器之间的传输,并且通知服务器传输的数据长度,服务器会处理这一段落的语音数据并返回处理结果,怎样才能实现“超过一定时间没有说话”的通知呢?
备注:
实现语言:C#

解决方案 »

  1.   

    写个算法,对byte[]数据进行分档评估,得到一个噪音阀值,判断是否那个人没说话。简单的话就计算5秒内buffer的均方差就行。
      

  2.   

    “用户超过指定时间没有说话”
    这句话就是指用户可能停顿了几秒钟,甚至说了一句就一直不说了,我希望在不说的时候可以中止声音传输,等他再说时再启动。
    另外一点,我的软件其实是做同声传译,声音送到服务器要进行翻译处理,不过语音引擎需要知道每次翻译多长的句子,还要知道长度。
    所以我才想到此对策,就是通过一定时间的“Timeout"来判断这句话说完了,然后通知服务器“可以翻译这句话了”。等用户再说下一句时继续录。
      

  3.   

    使用CaptureBuffer.Read方法不是返回了个byte[]吗?   这就是音频数据。现在的问题是怎么去评判人在说话没。考虑到背景噪音的影响,没人说话,可能byte[]里是80 75 81 82 76 79 88 ......如果是有人说话,就是180 210 80  69  133...你可以采用分段计算,每0.2秒(或者说1024*20byte)算一次均值(方差),比较5秒内的25次均方差的差异度。
    慢慢试,找出一个值,认定当差异度小于这个值就是没人说话    大于这个值就是有人说话。这种统计方式只是一种。也可以采用其他的方式。具体用什么算法,看你的需求,运行环境了。
      

  4.   

    再发一个没有说话时候的byte[]28 0 145 255 187 255 108 0 158 0 125 0 116 0 69 0 26 0 64 0 125 0 14 0 48 0 85 0 87 0 250 255 165 0 122 0 247 255 68 0 38 0 169 255 239 255 45 0 74 0 130 0 151 0 45 0 230 255 61 0 177 0 146 0 196 255 209 255 213 255 35 0 147 0 72 0 244 255 45 0 5 0 193 255 173 0 66 0 237 255 79 0 247 255 228 255 52 0 116 0 73 0 63 0 19 0 8 0 166 0 185 0 12 0 199 255 16 0 40 0 1 0 23 0 242 255 6 0 115 0 69 0 18 0 42 0 125 0 185 255 112 255 233 255 19 0 21 0 18 0 81 0 49 0 152 255 175 255 176 255 2 0 53 0 202 255 81 255 146 255 123 0 148 0 97 0 6 0 167 255 219 255 40 0 27 0 34 0 115 0 215 255 144 255 40 0 37 0 71 0 3 0 254 255 21 0 44 0 203 255 19 0 87 0 201 255 129 255 152 255 58 0 56 0 14 0 251 255 231 255 189 255 38 0 186 255 89 255 220 255 23 0 163 255 205 255 44 0 54 0 209 255 16 0 235 255 135 255 198 255 240 255 33 0 42 0 101 0 243 255 218 255 135 0 122 0 205 255 136 255 136 255 233 255 56 0 72 0 219 255 154 255 124 255 78 255 229 255 146 0 19 0 207 255 218 255 233 255 250 255 203 255 230 255 41 0 3 0 76 255 253 255 71 0 22 0 194 255 109 255 175 255 185 255 236 255 224 255 253 255 217 255 18 0 40 0 244 255 8 0 56 0 123 255 142 255 32 0 40 0 21 0 177 0 86 0 246 255 240 255 187 255 149 255 39 0 101 0 200 255 151 255 200 255 89 0 105 0 98 0 19 0 185 255 250 255 28 0 202 255 105 0 161 0 102 255 224 255 78 0 227 255 12 0 70 0 228 255 233 255 236 255 252 255 68 0 227 255 170 255 194 255 223 255 55 0 84 0 44 0 15 0 233 255 215 255 53 0 239 255 184 255 2 0 25 0 156 255 93 0 145 0 241 255 6 0 119 0 184 255 191 255 69 0 104 0 83 0 106 0 47 0 185 255 71 0 179 0 99 0 131 255 160 255 227 255 30 0 55 0 65 0 43 0 19 0 22 0 199 255 43 0 140 0 40 0 243 255 198 255 200 255 78 0 108 0 66 0 88 0 225 255 143 255 102 0 243 0 147 0 9 0 34 0 248 255 32 0 255 255 48 0 2 0 243 255 53 0 39 0 21 0 26 0 122 0 222 255 199 255 57 0 81 0 97 0 158 0 105 0 19 0 213 255 193 255 185 255 46 0 100 0 233 255 141 255 48 0 206 0 122 0 40 0 23 0 254 255 57 0 89 0 114 0 243 0 153 0 213 255 48 0 147 0 49 0 43 0 46 0 0 0 48 0 55 0 55 0 179 0 37 0 194 255 146 255 5 0 179 0 142 0 68 0 43 0 4 0 212 255 168 0 34 0 206 255 93 0 103 0 140 255 145 0 183 0 41 0 111 0 140 0 222 255 207 255 9 0 109 0 159 0 165 0 89 0 8 0 164 0 76 1 190 0 235 255 233 255 203 255 88 0 102 0 107 0 112 0 83 0 50 0 214 255 188 0 161 0 19 0 4 0 49 0 97 0 91 0 35 0 64 0 108 0 211 255 61 0 195 0 101 0 70 0 3 0 242 255 36 0 14 0 38 0 97 0 235 255 207 255 121 0 97 0 15 0 151 0 247 255 192 255 68 0 90 0 236 255 157 0 136 0 20 0 46 0 254 255 210 255 231 255 96 0 28 0 109 255 214 255 78 0 92 0 183 0 91 0 68 0 32 0 2 0 69 0 127 0 156 0 61 0 230 255 101 0 133 0 52 0 47 0 106 0 29 0 8 0 54 0 53 0 112 0 245 255 236 255 208 255 26 0 81 0 99 0 252 255 26 0 247 255 53 0 90 0 8 0 14 0 47 0 3 0 187 255 43 0 121 0 21 0 73 0 86 0 201 255 208 255 248 255 102 0 60 0 69 0 34 0 13 0 122 0 155 0 12 0 166 255 115 255 197 255 28 0 52 0 42 0 231 255 237 255 146 255 183 255 160 0 95 0 194 255 142 255 139 255 177 255 214 255 19 0 251 255 250 255 204 255 251 255 46 0 102 0 242 255 74 255 188 255 250 255 10 0 68 0 217 255 58 255 212 255 6
      

  5.   

     WaveFormat format = new WaveFormat();
                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的规格如上
      

  6.   

    我算了byte[]的平均值。
    从不说话,到说话,发现平均值变大了!或许?我可以用这个来判断?
    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
      

  7.   

    | | 取样1 | 取样2 |
    | 单声道 |--------------------------------------------------------
    | 16bit量化 | 声道0 | 声道0 | 声道0 | 声道0 |
    | | (低位字节) | (高位字节) | (低位字节) | (高位字节) |