public async Task ProcessBytes(byte[] data, WebSocketReceiveResult result) { var reservedBytes = 12; var soundChars = data .Take(result.Count) .Skip(reservedBytes) .Select(d => (char)d) .ToArray(); var soundData = new string(soundChars) .Trim() .Split(' ') .Select(s => double.Parse(s)); var normalizedSoundData = soundData .Select(d => d > 542 || d < 538 ? d : 0) .Select(d => d / 1024d) .ToArray(); var firstBlock = normalizedSoundData.Take(normalizedSoundData.Length / 2).ToArray(); var matches = _soundRecognitionService.Recognize(firstBlock).ToList(); var secondBlock = normalizedSoundData.Skip(normalizedSoundData.Length / 2).ToArray(); matches.AddRange(_soundRecognitionService.Recognize(secondBlock).ToList()); var mostSimilar = matches.OrderByDescending(m => m.Match).First(); if (mostSimilar.Match >= 0.6 && mostSimilar.Match <= 0.85) { return; } var sensorId = SensorHelper.IdFromBytes(data); var sensorInfo = await _sensorRepository.FindAsync(sensorId); var soundLabel = await _soundLabelRepository.GetByLabelNumberAsync(mostSimilar.LabelNumber); await _pushNotificationService.SendAsync(new PushNotificationModel { Notification = new NotificationContentModel { Body = soundLabel?.LabelDescription, Payload = sensorInfo.RoomTag, Title = sensorInfo.PlaceAlias }, RegistrationIds = sensorInfo.ObservingDevices?.Select(o => o.Device.Token).ToArray() }); await _soundLogRepository.CreateAsync(sensorId, soundLabel.LabelNumber, mostSimilar.Match); }