Compare commits

...

3 Commits

Author SHA1 Message Date
Nickolay Shmyrev d497c3a0a5 Move to 3-value endpointer config 2023-12-13 04:29:21 +01:00
Nickolay Shmyrev f37ee638a4 Add endpointer delays parameter 2023-11-27 15:02:55 +01:00
Nickolay Shmyrev e0b29bb17f Implement more endpointer modes 2023-11-10 01:58:31 +01:00
7 changed files with 212 additions and 26 deletions
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env python3
import wave
import sys
from vosk import Model, KaldiRecognizer, SetLogLevel, EndpointerMode
# You can set log level to -1 to disable debug messages
SetLogLevel(0)
wf = wave.open(sys.argv[1], "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
print("Audio file must be WAV format mono PCM.")
sys.exit(1)
model = Model(lang="en-us")
# You can also init model by name or with a folder path
# model = Model(model_name="vosk-model-en-us-0.21")
# model = Model("models/en")
rec = KaldiRecognizer(model, wf.getframerate())
rec.SetWords(True)
rec.SetPartialWords(True)
rec.SetEndpointerMode(EndpointerMode.VERY_LONG)
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if rec.AcceptWaveform(data):
print(rec.Result())
else:
print(rec.PartialResult())
print(rec.FinalResult())
wf = wave.open(sys.argv[1], "rb")
if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE":
print("Audio file must be WAV format mono PCM.")
sys.exit(1)
rec.SetEndpointerDelays(300, 500, 2000)
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if rec.AcceptWaveform(data):
print(rec.Result())
else:
print(rec.PartialResult())
print(rec.FinalResult())
+1 -1
View File
@@ -45,7 +45,7 @@ with open("README.md", "rb") as fh:
setuptools.setup(
name="vosk",
version="0.3.45",
version="0.3.46",
author="Alpha Cephei Inc",
author_email="contact@alphacephei.com",
description="Offline open source speech recognition API based on Kaldi and Vosk",
+15 -5
View File
@@ -142,10 +142,17 @@ class SpkModel:
def __del__(self):
_c.vosk_spk_model_free(self._handle)
class EpMode(enum.Enum):
class EndpointerMode(enum.Enum):
DEFAULT = 0
SHORT = 1
LONG = 2
SINGLE_WORD = 1
VERY_SHORT = 2
SHORT = 3
STANDARD = 4
STANDARD_5 = 5
STANDARD_180 = 6
LONG = 7
VERY_LONG = 8
VERY_LONG_180 = 9
class KaldiRecognizer:
@@ -179,8 +186,11 @@ class KaldiRecognizer:
def SetNLSML(self, enable_nlsml):
_c.vosk_recognizer_set_nlsml(self._handle, 1 if enable_nlsml else 0)
def SetEpMode(self, mode):
_c.vosk_recognizer_set_ep_mode(self._handle, mode.value)
def SetEndpointerMode(self, mode):
_c.vosk_recognizer_set_endpointer_mode(self._handle, mode.value)
def SetEndpointerDelays(self, sct, nit, t):
_c.vosk_recognizer_set_endpointer_delays(self._handle, sct, nit, t)
def SetSpkModel(self, spk_model):
_c.vosk_recognizer_set_spk_model(self._handle, spk_model._handle)
+106 -11
View File
@@ -220,26 +220,121 @@ void Recognizer::SetNLSML(bool nlsml)
nlsml_ = nlsml;
}
void Recognizer::SetEpMode(int mode)
void Recognizer::SetEndpointerMode(int mode)
{
float rule1, rule2, rule3, rule4, rule5;
if (mode == 0) {
endpoint_config_ = model_->endpoint_config_;
return;
}
float scale = 1.0;
switch(mode) {
case 1:
scale = 0.75;
case 1: // SINGLE_WORD
rule2 = 0.1;
rule3 = 0.15;
rule4 = 0.2;
rule1 = 4.0;
rule5 = 7.0;
break;
case 2:
scale = 1.50;
case 2: // VERY_SHORT
rule2 = 0.3;
rule3 = 0.3;
rule4 = 0.6;
rule1 = 3.0;
rule5 = 5.0;
break;
case 3: // SHORT
rule2 = 0.3;
rule3 = 0.4;
rule4 = 0.6;
rule1 = 3.0;
rule5 = 5.0;
break;
case 4: // STANDARD
rule2 = 0.8;
rule3 = 0.9;
rule4 = 1.0;
rule1 = 3.0;
rule5 = 7.0;
break;
case 5: // STANDARD_5
rule2 = 0.8;
rule3 = 0.9;
rule4 = 1.5;
rule1 = 5.0;
rule5 = 7.0;
break;
case 6: // STANDARD_180
rule2 = 0.8;
rule3 = 0.9;
rule4 = 1.5;
rule1 = 3.0;
rule5 = 180.0;
break;
case 7: // LONG
rule2 = 1.0;
rule3 = 1.2;
rule4 = 2.0;
rule1 = 4.0;
rule5 = 10.0;
break;
case 8: // VERY_LONG
rule2 = 2.0;
rule3 = 2.5;
rule4 = 3.0;
rule1 = 4.0;
rule5 = 15.0;
break;
case 9: // VERY_LONG_180
rule2 = 2.0;
rule3 = 2.5;
rule4 = 3.0;
rule1 = 4.0;
rule5 = 180.0;
break;
default: // STANDARD
rule2 = 0.8;
rule3 = 0.9;
rule4 = 1.0;
rule1 = 5.0;
rule5 = 7.0;
break;
default:
scale = 4.0;
}
KALDI_LOG << "Endpointer Scale " << scale;
KALDI_LOG << "Updating endpointer timeouts to " << rule1 << "," << rule2 << "," << rule3 << "," << rule4 << "," << rule5;
endpoint_config_ = model_->endpoint_config_;
endpoint_config_.rule2.min_trailing_silence *= scale;
endpoint_config_.rule3.min_trailing_silence *= scale;
endpoint_config_.rule4.min_trailing_silence *= scale;
endpoint_config_.rule1.min_trailing_silence = rule1;
endpoint_config_.rule2.min_trailing_silence = rule2;
endpoint_config_.rule3.min_trailing_silence = rule3;
endpoint_config_.rule4.min_trailing_silence = rule4;
endpoint_config_.rule5.min_utterance_length = rule5;
}
void Recognizer::SetEndpointerDelays(int sct, int nit, int t)
{
float rule1, rule2, rule3, rule4, rule5;
rule2 = sct / 1000.0;
if (sct < 500) {
rule3 = sct / 1000.0 * 1.5;
rule4 = sct / 1000.0 * 2;
} else {
rule3 = sct / 1000.0 + 0.5;
rule4 = sct / 1000.0 + 1.0;
}
rule1 = nit / 1000.0;
rule5 = t / 1000.0;
KALDI_LOG << "Updating endpointer timeouts to " << rule1 << "," << rule2 << "," << rule3 << "," << rule4 << "," << rule5;
endpoint_config_ = model_->endpoint_config_;
endpoint_config_.rule1.min_trailing_silence = rule1;
endpoint_config_.rule2.min_trailing_silence = rule2;
endpoint_config_.rule3.min_trailing_silence = rule3;
endpoint_config_.rule4.min_trailing_silence = rule4;
endpoint_config_.rule5.min_utterance_length = rule5;
}
void Recognizer::SetSpkModel(SpkModel *spk_model)
{
if (state_ == RECOGNIZER_RUNNING) {
+2 -1
View File
@@ -52,7 +52,8 @@ class Recognizer {
void SetWords(bool words);
void SetPartialWords(bool partial_words);
void SetNLSML(bool nlsml);
void SetEpMode(int mode);
void SetEndpointerMode(int mode);
void SetEndpointerDelays(int sct, int nit, int t);
bool AcceptWaveform(const char *data, int len);
bool AcceptWaveform(const short *sdata, int len);
bool AcceptWaveform(const float *fdata, int len);
+10 -2
View File
@@ -129,12 +129,20 @@ void vosk_recognizer_set_grm(VoskRecognizer *recognizer, char const *grammar)
((Recognizer *)recognizer)->SetGrm(grammar);
}
void vosk_recognizer_set_ep_mode(VoskRecognizer *recognizer, VoskEpMode mode)
void vosk_recognizer_set_endpointer_mode(VoskRecognizer *recognizer, VoskEndpointerMode mode)
{
if (recognizer == nullptr) {
return;
}
((Recognizer *)recognizer)->SetEpMode(mode);
((Recognizer *)recognizer)->SetEndpointerMode(mode);
}
void vosk_recognizer_set_endpointer_delays(VoskRecognizer *recognizer, int sct, int nit, int t)
{
if (recognizer == nullptr) {
return;
}
((Recognizer *)recognizer)->SetEndpointerDelays(sct, nit, t);
}
int vosk_recognizer_accept_waveform(VoskRecognizer *recognizer, const char *data, int length)
+23 -6
View File
@@ -217,18 +217,35 @@ void vosk_recognizer_set_partial_words(VoskRecognizer *recognizer, int partial_w
*/
void vosk_recognizer_set_nlsml(VoskRecognizer *recognizer, int nlsml);
typedef enum VoskEpMode {
VOSK_EP_ANSWER_DEFAULT = 0,
VOSK_EP_ANSWER_SHORT = 1,
VOSK_EP_ANSWER_LONG = 2,
} VoskEpMode;
typedef enum VoskEndpointerMode {
VOSK_EP_DEFAULT = 0,
VOSK_EP_SINGLE_WORD = 1,
VOSK_EP_VERY_SHORT = 2,
VOSK_EP_SHORT = 3,
VOSK_EP_STANDARD = 4,
VOSK_EP_STANDARD_5 = 5,
VOSK_EP_STANDARD_180 = 6,
VOSK_EP_LONG = 7,
VOSK_EP_VERY_LONG = 8,
VOSK_EP_VERY_LONG_180 = 9
} VoskEndpointerMode;
/**
* Set endpointer scaling factor
*
* @param mode - Endpointer mode
**/
void vosk_recognizer_set_ep_mode(VoskRecognizer *recognizer, VoskEpMode mode);
void vosk_recognizer_set_endpointer_mode(VoskRecognizer *recognizer, VoskEndpointerMode mode);
/**
* Set endpointer delays
*
* @param sct speech complete timeout
* @param sint speech incomplete timeout
* @param nit no input timeout
* @param t recognition timeout
**/
void vosk_recognizer_set_endpointer_delays(VoskRecognizer *recognizer, int sct, int nit, int t);
/** Accept voice data
*