Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/android-speech-recognition.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2014-07-21 00:06:22 +0400
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2014-07-21 00:06:22 +0400
commit103786409151cbda61df76401602968243600fa5 (patch)
treeb6a69bdc1c8cad0c772c69998646bc63ec85f103
parent32f8528fa1e49322980202ffac8e43fcc51476da (diff)
Codepage fix
-rw-r--r--src/com/Cluster/SpeechRecognizer/SpeechRecognizer.java102
1 files 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)
{