From 103786409151cbda61df76401602968243600fa5 Mon Sep 17 00:00:00 2001 From: Alexey 'Cluster' Avdyukhin Date: Mon, 21 Jul 2014 00:06:22 +0400 Subject: Codepage fix --- .../Cluster/SpeechRecognizer/SpeechRecognizer.java | 102 ++++++++++----------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/com/Cluster/SpeechRecognizer/SpeechRecognizer.java b/src/com/Cluster/SpeechRecognizer/SpeechRecognizer.java index 69e7967..fe01a8a 100644 --- a/src/com/Cluster/SpeechRecognizer/SpeechRecognizer.java +++ b/src/com/Cluster/SpeechRecognizer/SpeechRecognizer.java @@ -26,52 +26,52 @@ public class SpeechRecognizer { final String API_KEY = "YOUR_API_KEY"; final String TAG = "SpeechRecognizer"; - // + // Частота дискретизации final int SAMPLE_RATE = 8000; - // + // Длительность анализируемых сэмплов final int TIMER_INTERVAL = 100; - // , + // Время, в течении которого анализируется громкость final int MAX_ANALYZE_LENGTH = 3000; - // + // Соотношение громкости речи к громкости фона final float VOLUME_RATIO = 1.25f; - // - , - // + // Максимальное кол-во ошибок, после которого увеличивается амплитуда + // срабатывания final float MAX_ERROR_COUNT = 3; - // , + // Если в течении этого времени нет ошибок, сбрасываем счётчик ошибок final int MAX_NO_ERROR_TIME = 10000; - // + // Слушатель VoiceRecognizedListener voiceRecognizedListener = null; - // + // Какой процент значений громкости должен превышать уровень определения float detectRatio = 0.25f; - // + // Сколько нужно молчать перед распознаванием фразы в миллисекундах int maxSilenceLength = 500; - // + // Минимальная длина фразы в миллисекундах int minRecordLength = 500; - // + // Максимальная длина фразы в миллисекундах int maxRecordLength = 5000; - // + // Языка String language = "en-US"; - // - + // Максимальное кол-во результатов int maxResults = 5; - // , + // Громкость, с которой должен звучать голос int detectLevel = 32767; - // + // Пишем ли звук в данных момент boolean recording = false; - // + // Длина записи int recordLength = 0; - // + // Длина тишины int silenceLength = 0; - // + // Сколько звука мы проанализировали на громкость int analyzeLength = 0; - // + // Количество ошибок распознавания подряд int errorCount = 0; - // , + // Время, в течении которого нет ошибок int noErrorTimer = 0; - // , + // Максимальная громкость фона, когда человек молчит int maxSilenceLevel = 0; - // + // Максимальная громкость int maxLevel = 0; AudioRecord aRecorder; @@ -151,8 +151,8 @@ public class SpeechRecognizer public void start() throws Exception { if (aRecorder != null) - return; // - // + return; // Уже запущены + // Параметры захвата int audioSource = MediaRecorder.AudioSource.MIC; final int channelConfig = AudioFormat.CHANNEL_IN_MONO; int nChannels = 1; @@ -166,7 +166,7 @@ public class SpeechRecognizer Log.w(TAG, "Increasing buffer size to " + Integer.toString(bufferSize)); } - // + // Запускаем захват аудио aRecorder = new AudioRecord(audioSource, SAMPLE_RATE, channelConfig, audioFormat, bufferSize); if (aRecorder.getState() != AudioRecord.STATE_INITIALIZED) { @@ -178,7 +178,7 @@ public class SpeechRecognizer aRecorder.setPositionNotificationPeriod(framePeriod); buffer = new byte[framePeriod * bSamples / 8 * nChannels]; aRecorder.startRecording(); - // Android + // Нужно для некоторых старых версий Android aRecorder.read(buffer, 0, buffer.length); Log.i(TAG, "Started"); } @@ -200,14 +200,14 @@ public class SpeechRecognizer { if (aRecorder == null) return; // Stopped - // + // Читаем данные int len = aRecorder.read(buffer, 0, buffer.length); int maxAmplitude = 0; int detects = 0; - // + // Проходимся вдоль записанного сэмпла for (int p = 0; p < len - 1; p += 2) { - // WTF. little-endian signed bytes int + // WTF. Конвертируем little-endian signed bytes в int int level = buffer[p + 1] * 256 + ((buffer[p] >= 0) ? buffer[p] : (256 + buffer[p])); int amplitude = Math.abs(level); if (amplitude > maxAmplitude) @@ -216,14 +216,14 @@ public class SpeechRecognizer detects++; } - // - // + // Анализ фоновой громоксти + // Запоминаем максимальную среднюю громкость if (maxAmplitude > maxLevel) { maxLevel = maxAmplitude; } - // , - - // ? + // Если достаточно тихо, то смотрим - не понизить ли громкость + // срабатывания? if (detects == 0) { if (analyzeLength >= MAX_ANALYZE_LENGTH) @@ -246,43 +246,43 @@ public class SpeechRecognizer // Log.d(TAG, "Data: " + len + ", max: " + maxAmplitude + // ", detects: " + detects); - // - // ? + // Достигнуто ли нужное количество превышений амплитуды + // срабатывания? boolean voiceDetected = (detects > len / 2 * detectRatio); - if (!recording) // ... + if (!recording) // Если запись не идёт... { - if (voiceDetected) // + if (voiceDetected) // И мы обнаружили вспышку амплитуды { - // + // Запускаем запись recording = true; recordLength = TIMER_INTERVAL; Log.d(TAG, "Voice record started"); } else { - // , + // Если запись не идёт, мы всегда держим в запасе один семпл record.reset(); record.write(buffer, 0, len); - // , + // Тишина, ошибок точно нет noErrorTimer++; if (noErrorTimer >= MAX_NO_ERROR_TIME) errorCount = 0; } } - if (recording) // ( ) + if (recording) // Если запись идёт (или началась только что) { - // + // Пишем звук в буфер recordLength += TIMER_INTERVAL; record.write(buffer, 0, len); - // - // + // Если в этот раз голос не обнаружили + // Или если пишем его уже слишком долго if (!voiceDetected || (maxRecordLength < recordLength)) { - // + // Считаем как долго silenceLength += TIMER_INTERVAL; if ((silenceLength >= maxSilenceLength) || (maxRecordLength < recordLength)) { - // + // Пора прекражать запись recording = false; Log.d(TAG, "Voice record stopped, length: " + (recordLength - silenceLength)); if (recordLength - silenceLength >= minRecordLength) @@ -297,14 +297,14 @@ public class SpeechRecognizer } } } else - silenceLength = 0; // , + silenceLength = 0; // Не молчат, обнуляем счётчик тишины } } @Override public void onMarkerReached(AudioRecord recorder) { - // + // Не нужно } }; @@ -399,13 +399,13 @@ public class SpeechRecognizer results.add(r); Log.d(TAG, "Result: " + r); } - // , ? + // Результат пустой, может слишком громко? if (results.isEmpty()) { Log.d(TAG, "Google can't understand you"); errorCount++; noErrorTimer = 0; - if (errorCount >= MAX_ERROR_COUNT) // ? + if (errorCount >= MAX_ERROR_COUNT) // А бывает иначе? { if (maxLevel > detectLevel) { -- cgit v1.2.3