Compare commits

...

38 Commits

Author SHA1 Message Date
Nickolay Shmyrev 80e60b9118 LM Rescoring 2020-04-28 22:17:34 +02:00
Nickolay Shmyrev e3a95a44bc Added Turkish model 2020-04-28 10:10:35 +02:00
Nickolay Shmyrev 86caf526f5 New model layout and model config file with beams for decoding 2020-04-28 01:06:41 +02:00
Nickolay Shmyrev e09f32b4b4 Properly stop listening so it can continue later 2020-04-27 09:00:32 +02:00
Nickolay Shmyrev 3803ab345d Proper reference couting of the models to avoid memory issus 2020-04-23 23:37:52 +02:00
Nickolay V. Shmyrev 889b43136f Update README.zh.md 2020-04-23 12:43:00 +02:00
John Baber-Lucero b517cf46af Fix some grammar/punctuation 2020-04-23 00:28:34 -04:00
Nickolay Shmyrev ffd810fe00 Fix threading bug 2020-04-22 22:15:45 +02:00
Nickolay V. Shmyrev a1a0ed70a1 Update README.zh.md 2020-04-22 18:29:01 +03:00
Nickolay Shmyrev 1554d9ede7 Added per-language readme 2020-04-22 13:21:36 +02:00
Nickolay Shmyrev 6f3190d83d Version 0.3.4 and arm wheels for python 3.6 2020-04-21 11:38:56 +02:00
Nickolay Shmyrev 3caaa32ec0 How to ask for the accuracy updates 2020-04-20 23:11:52 +02:00
Nickolay Shmyrev 3facf3ccf5 UI updates 2020-04-20 11:08:18 +03:00
Nickolay Shmyrev fad954e6e3 Full iOS project 2020-04-19 22:48:47 +03:00
Nickolay Shmyrev c4809cb618 Added Vietnamese model 2020-04-19 20:14:05 +02:00
Nickolay Shmyrev a241423baf Added iOS bits 2020-04-18 17:34:03 +03:00
Nickolay Shmyrev 1e9421dd38 Add a note about iOS 2020-04-18 15:41:51 +02:00
Nickolay Shmyrev b09ffda760 Fixes links and issue #59 2020-04-11 22:15:46 +02:00
Nickolay Shmyrev aeff663a7c Fix pocketsphinx references in Android sources 2020-04-09 21:50:38 +02:00
Nickolay Shmyrev fcd17fcd4c Added Russian model 0.9 2020-04-07 17:48:29 +02:00
Nickolay Shmyrev feffb2711d Repair travis build 2020-04-04 20:49:06 +02:00
Nickolay Shmyrev f76e5b592f kaldi-ru-0.8 2020-04-04 10:27:02 +02:00
Nickolay Shmyrev 71bdc900e3 C-only wrapper 2020-04-04 10:22:01 +02:00
Nickolay Shmyrev 96bbf5abc2 Add C API 2020-04-04 10:04:49 +02:00
Nickolay Shmyrev df9424a228 Introduce pure C api to deal with Windows runtime issues and make it easy to wrap in Swift 2020-04-04 00:35:56 +02:00
Nickolay Shmyrev 3310acaf54 Add lm to kaldi-android 2020-03-28 22:45:38 +01:00
Nickolay V. Shmyrev e8722d462d Merge pull request #54 from andremendesc/master
Fixes folder name instruction for python model on microphone test
2020-03-25 08:37:25 +03:00
André Mendes 14b2c13ed6 Fixes folder name instruction for python model on microphone test 2020-03-25 01:01:23 -03:00
Nickolay Shmyrev 19af324096 Small fix by Funny Jingl 2020-03-19 23:24:41 +01:00
Nickolay Shmyrev 0ca7b94e08 Add link on kaldi-ru-0.7 2020-03-19 20:14:41 +01:00
Nickolay Shmyrev 04ed310229 Move models list to doc 2020-03-15 22:39:57 +01:00
Nickolay Shmyrev 7ac33d521c Added information about models 2020-03-15 22:27:47 +01:00
Nickolay V. Shmyrev 08ada63da4 Added note about other projects 2020-03-15 02:48:49 +03:00
Nickolay Shmyrev cef3fd72fb Disable NEON fpu on ARMv6
Fixes issue #46
2020-03-10 00:24:57 +01:00
Nickolay V. Shmyrev bf973ff434 Merge pull request #43 from camillem/patch-1
Typo in folder name
2020-03-02 15:47:25 +03:00
camillem a172d60b20 Typo in folder name 2020-03-02 13:46:34 +01:00
Nickolay Shmyrev 060e4395c2 Fix repeating results issue #42
Thanks to Yondu Tsai
2020-03-02 13:41:27 +01:00
Nickolay Shmyrev 03f1417454 Added small readme 2020-03-01 09:12:09 +01:00
51 changed files with 1829 additions and 228 deletions
+1 -1
View File
@@ -34,4 +34,4 @@ java/*.cc
# CSharp
csharp/gen
csharp/*.exe
csharp/*.cc
csharp/*.c
+50 -22
View File
@@ -1,11 +1,19 @@
[![Build Status](https://travis-ci.com/alphacep/vosk-api.svg?branch=master)](https://travis-ci.com/alphacep/vosk-api)
Language bindings for Vosk and Kaldi to access speech recognition from various languages and on various platforms
[РУС](README.ru.md)
* Python on Linux, Windows and RPi
* Node
* Android
* iOS
[中文](README.zh.md)
Vosk is a speech recognition toolkit. The best things in Vosk are:
1. Supports 9 languages - English, German, French, Spanish, Portuguese, Chinese, Russian, Turkish, Vietnamese. More to come.
1. Works offline, even on lightweight devices - Raspberry Pi, Android, iOS
1. Installs with simple `pip3 install vosk`
1. Portable per-language models are only 50Mb each, but there are much bigger server models available.
1. Provides streaming API for the best user experience (unlike popular speech-recognition python packages)
1. There are bindings for different programming languages, too - java/csharp/javascript etc.
1. Allows quick reconfiguration of vocabulary for best accuracy.
1. Supports speaker identification beside simple speech recognition.
## Android build
@@ -16,6 +24,12 @@ gradle build
Please note that medium blog post about 64-bit is not relevant anymore, the script builds x86, arm64 and armv7 libraries automatically without any modifications.
For example of Android application using Vosk-API check https://github.com/alphacep/kaldi-android-demo project
## iOS build
Available on request. Drop as a mail at [contact@alphacephei.com](mailto:contact@alphacephei.com).
## Python installation from Pypi
The easiest way to install vosk api is with pip. You do not have to compile anything. We currently support only Linux on x86_64 and Raspberry Pi. Other systems (windows, mac) will come soon.
@@ -31,6 +45,19 @@ Uprade python and pip if needed. Then install vosk on Linux with a simple comman
pip3 install vosk
```
## Websocket Server and GRPC server
We also provide a websocket server and grpc server which can be used in telephony and other applications. With bigger models adapted for 8khz audio it provides more accuracy.
The server is installed with docker and can run with a single command:
```
docker run -d -p 2700:2700 alphacep/kaldi-en:latest
```
For details see https://github.com/alphacep/vosk-server
## Compilation from source
If you still want to build from scratch, you can compile Kaldi and Vosk yourself. The compilation is straightforward but might be a little confusing for newbie. In case you want to follow this, please watch the errors.
@@ -62,6 +89,22 @@ cd python
python3 setup.py install
```
#### Running the example code with python
Run like this:
```
cd vosk-api/python/example
wget https://github.com/alphacep/kaldi-android-demo/releases/download/2020-01/alphacep-model-android-en-us-0.3.tar.gz
tar xf alphacep-model-android-en-us-0.3.tar.gz
mv alphacep-model-android-en-us-0.3 model-en
python3 ./test_simple.py test.wav
```
To run with your audio file make sure it has proper format - PCM 16khz 16bit mono, otherwise decoding will not work.
You can find other examples of using a microphone, decoding with a fixed small vocabulary or speaker identification setup in [python/example subfolder](https://github.com/alphacep/vosk-api/tree/master/python/example)
#### Java example API build
Or Java
@@ -86,23 +129,9 @@ mv alphacep-model-android-en-us-0.3 model
mono test.exe
```
## Running the example code with python
## Models for different languages
Run like this:
```
cd vosk-api/python/example
wget https://github.com/alphacep/kaldi-android-demo/releases/download/2020-01/alphacep-model-android-en-us-0.3.tar.gz
tar xf alphacep-model-android-en-us-0.3.tar.gz
mv alphacep-model-android-en-us-0.3 model
python3 ./test_simple.py test.wav
```
There are models for other languages (English, Chinese, Spanish, Portuguese, German, French, Russian) available too at https://github.com/alphacep/kaldi-android-demo/releases
To run with your audio file make sure it has proper format - PCM 16khz 16bit mono, otherwise decoding will not work.
You can find other examples of using a microphone, decoding with a fixed small vocabulary or speaker identification setup in [python/example subfolder](https://github.com/alphacep/vosk-api/tree/master/python/example)
For information about models see [the documentation on available models](https://github.com/alphacep/vosk-api/blob/master/doc/models.md).
## Contact Us
@@ -111,4 +140,3 @@ If you have any questions, feel free to
* Post an issue here on github
* Send us an e-mail at [contact@alphacephei.com](mailto:contact@alphacephei.com)
* Join our group dedicated to speech recognition on Telegram [@speech_recognition](https://t.me/speech_recognition)
+149
View File
@@ -0,0 +1,149 @@
[![Build Status](https://travis-ci.com/alphacep/vosk-api.svg?branch=master)](https://travis-ci.com/alphacep/vosk-api)
[EN](README.md)
[中文](README.zh.md)
Библитека для распознавания речи "Воск". Преимущества библиотеки:
1. Поддерживает 9 языков - русский, английский, немецкий, французский, португальский, испанский, китайский, турецкий, вьетнамский. В скором времени будут добавлены и другие
1. Работает без доступа к сети даже на мобильных устройствах - Raspberry Pi, Android, iOS
1. Устанавливается с помощью простой команды `pip3 install vosk` без дополнительных шагов
1. Модели для каждого языка занимают всего 50Мб, но есть и гораздо более точные большие модели для более точного распознавания
1. Сделана для потоковой обработки звука, что позволяет реализовать мгновенную реакцию на команды
1. Поддерживает несколько популярных языков программирования - Java, C#, Javascript
1. Позволяет быстро настраивать словарь распознавания для улучшения точности распознавания
1. Позволяет идентифицировать говорящего
## Сборка для Android
```
cd android
gradle build
```
Сборка включает платформы x86, armv7, arm64
Для примера приложения, созданного с помощью библиотеки "Воск" смотрите [демо проект](https://github.com/alphacep/kaldi-android-demo).
## Сборка для iOS
Доступна позапросу. Напишите нам [contact@alphacephei.com](mailto:contact@alphacephei.com).
## Установка для работы Python из Pypi
Проще всего установить "Воск" с помощью pip. Собирать ничего не нужно. Мы поддерживаем платформы Linux, RPi и Windows. Сборка для OSX будет скоро доступна.
Для начала убедитесь, что используются достаточно новые версии pip и Python:
* Python версия >= 3.5
* pip версия >= 19.0
Обновите Python и Pip если нужно, а затем установите "Воск" такой командой:
```
pip3 install vosk
```
Для использования "Воск" смотрите примеры ниже.
## Сервер для протоколов Websocket и GRPC
We also provide a websocket server and grpc server which can be used in telephony and other applications. With bigger models adapted for 8khz audio it provides more accuracy.
The server is installed with docker and can run with a single command:
```
docker run -d -p 2700:2700 alphacep/kaldi-en:latest
```
Смотрите проект https://github.com/alphacep/vosk-server
## Сборка из исходников
Если нужно собрать проект из исходного кода, необходимо будет собрать
Kaldi самостоятельно. Сборка досаточно простая и прямолинейная, но может
быть непривычной для начинающих. Обращайте внимания на сообщения об ошибках
в процессе сборки.
#### Сборка Kaldi для модулей на Python, Java, C#
```
git clone https://github.com/kaldi-asr/kaldi
cd kaldi/tools
make
```
установите все рекомандуемые пакеты и повторите `make` если потребуется.
```
extras/install_openblas.sh
cd ../src
./configure --mathlib=OPENBLAS --shared --use-cuda=no
make -j 10
```
#### Сборка модуля на Python
После Kaldi можно собрать модуль Python
```
export KALDI_ROOT=<KALDI_ROOT>
cd python
python3 setup.py install
```
#### Запуск примера для Python
Выполните следующие команды:
```
cd vosk-api/python/example
wget https://github.com/alphacep/kaldi-android-demo/releases/download/2020-01/alphacep-model-android-en-us-0.3.tar.gz
tar xf alphacep-model-android-en-us-0.3.tar.gz
mv alphacep-model-android-en-us-0.3 model-en
python3 ./test_simple.py test.wav
```
Для того, чтобы распознавать другой файл, переведите его в нужный формат - PCM 16кГц 16бит 1канал. Это можно сделать с помощью ffmpeg.
Другие примеры, в том числе использования микрофона, распознавание с небольшим словарём и распознавание говорящего можно найти в [каталоге python/example](https://github.com/alphacep/vosk-api/tree/master/python/example)
#### Сборка для Java
Перейдите в каталог Java и запустите сборку
```
cd java && KALDI_ROOT=<KALDI_ROOT> make
wget https://github.com/alphacep/kaldi-android-demo/releases/download/2020-01/alphacep-model-android-en-us-0.3.tar.gz
tar xf alphacep-model-android-en-us-0.3.tar.gz
mv alphacep-model-android-en-us-0.3 model
make run
```
#### Сборка для C#
Для сборки в среде Mono.
```
cd csharp && KALDI_ROOT=<KALDI_ROOT> make
wget https://github.com/alphacep/kaldi-android-demo/releases/download/2020-01/alphacep-model-android-en-us-0.3.tar.gz
tar xf alphacep-model-android-en-us-0.3.tar.gz
mv alphacep-model-android-en-us-0.3 model
mono test.exe
```
.NET тоже должен работать, хотя мы не пробовали.
## Модели для разных языков
По информации о моделях смотрите соответствующую [страницу документации](https://github.com/alphacep/vosk-api/blob/master/doc/models.md).
## Contact Us
Если возникли вопросы, свяжитесь с нами:
* Создайте проблему тут на github
* Напишите нам по почте [contact@alphacephei.com](mailto:contact@alphacephei.com)
* Заходите в нашу группу в Телеграмме [@speech_recognition_ru](https://t.me/speech_recognition_ru)
+12
View File
@@ -0,0 +1,12 @@
[![Build Status](https://travis-ci.com/alphacep/vosk-api.svg?branch=master)](https://travis-ci.com/alphacep/vosk-api)
Vosk是言语识别工具包。Vosk最好的事情是:
1. 支持九种语言 - 中文, 英语,德语,法语,西班牙语,葡萄牙语,俄语,土耳其语,越南语
1. 移动设备上脱机工作-Raspberry PiAndroidiOS
1. 使用简单的 pip3 install vosk 安装
1. 每种语言的手提式模型只有是50Mb, 但还有更大的服务器模型可用
1. 提供流媒体API,以提供最佳用户体验(与流行的语音识别python包不同)
1. 还有用于不同编程语言的包装器-java / csharp / javascript等
1. 可以快速重新配置词汇以实现最佳准确性
1. 支持说话人识别
+2
View File
@@ -23,6 +23,8 @@ set(API_SOURCES
"${PROJECT_SOURCE_DIR}/../src/model.h"
"${PROJECT_SOURCE_DIR}/../src/spk_model.cc"
"${PROJECT_SOURCE_DIR}/../src/spk_model.h"
"${PROJECT_SOURCE_DIR}/../src/vosk_api.cc"
"${PROJECT_SOURCE_DIR}/../src/vosk_api.h"
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -DFST_NO_DYNAMIC_LINKING")
+1 -1
View File
@@ -125,6 +125,6 @@ CXX=$CXX CXXFLAGS="$ARCHFLAGS -O3 -DFST_NO_DYNAMIC_LINKING" ./configure --use-cu
--fst-root=${WORKDIR}/local --fst-version=${OPENFST_VERSION}
make -j 8 depend
make -j 8 online2
make -j 8 online2 lm
done
+1 -1
View File
@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="edu.cmu.pocketsphinx">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.kaldi">
</manifest>
@@ -31,7 +31,7 @@ import android.util.Log;
/**
* Main class to access recognizer functions. After configuration this class
* starts a listener thread which records the data and recognizes it using
* Pocketsphinx engine. Recognition events are passed to a client using
* VOSK engine. Recognition events are passed to a client using
* {@link RecognitionListener}
*
*/
@@ -149,7 +149,7 @@ public class SpeechRecognizer {
boolean result = stopRecognizerThread();
if (result) {
Log.i(TAG, "Stop recognition");
mainHandler.post(new ResultEvent(recognizer.FinalResult(), true));
mainHandler.post(new ResultEvent(recognizer.Result(), true));
}
return result;
}
@@ -162,6 +162,7 @@ public class SpeechRecognizer {
*/
public boolean cancel() {
boolean result = stopRecognizerThread();
recognizer.Result(); // Reset recognizer state
if (result) {
Log.i(TAG, "Cancel recognition");
}
+13 -7
View File
@@ -11,6 +11,7 @@ KALDI_LIBS = \
${KALDI_ROOT}/src/tree/kaldi-tree.a \
${KALDI_ROOT}/src/feat/kaldi-feat.a \
${KALDI_ROOT}/src/lat/kaldi-lat.a \
${KALDI_ROOT}/src/lm/kaldi-lm.a \
${KALDI_ROOT}/src/hmm/kaldi-hmm.a \
${KALDI_ROOT}/src/transform/kaldi-transform.a \
${KALDI_ROOT}/src/cudamatrix/kaldi-cudamatrix.a \
@@ -21,7 +22,7 @@ KALDI_LIBS = \
${KALDI_ROOT}/tools/openfst/lib/libfst.a \
${KALDI_ROOT}/tools/openfst/lib/libfstngram.a \
${KALDI_ROOT}/tools/OpenBLAS/libopenblas.a \
-lgfortran
-lgfortran -lstdc++
all: test.exe
@@ -29,20 +30,25 @@ test.exe: libkaldiwrap.so test.cs
mcs test.cs gen/*.cs
VOSK_SOURCES = \
vosk_wrap.cc \
vosk_wrap.c \
../src/kaldi_recognizer.cc \
../src/kaldi_recognizer.h \
../src/model.cc \
../src/model.h \
../src/spk_model.cc \
../src/spk_model.h
../src/spk_model.h \
../src/vosk_api.cc \
../src/vosk_api.h
libkaldiwrap.so: $(VOSK_SOURCES)
$(CXX) -fpermissive $(CFLAGS) $(CPPFLAGS) -shared -o $@ $(VOSK_SOURCES) $(KALDI_LIBS)
vosk_wrap.cc: ../src/vosk.i
swig -csharp -dllimport "libkaldiwrap.so" \
-namespace "Kaldi" -c++ -outdir gen -o vosk_wrap.cc ../src/vosk.i
vosk_wrap.c: ../src/vosk.i
swig -csharp -DSWIG_CSHARP_NO_EXCEPTION_HELPER -dllimport "libkaldiwrap.so" \
-namespace "Kaldi" -outdir gen -o vosk_wrap.c ../src/vosk.i
run:
mono test.exe
clean:
$(RM) *.so vosk_wrap.cc *.o gen/*.cs test.exe
$(RM) *.so vosk_wrap.c *.o gen/*.cs test.exe
+21
View File
@@ -0,0 +1,21 @@
## Accuracy issues
Accuracy of modern systems is still unstable, that means sometimes you can have a very good accuracy and sometimes it could be bad.
It is hard to make a system that will work good. And there could be many reasons for that:
* Audio has very bad quality
* Vocabulary of the system doesn't match (yes, we still use fixed vocabulary)
* Audio conditions like accent were not really the ones that were used in training
* Some unpredictable audio issues like frame drop or frame coding bugs
* Software bugs
It is hard to guess what is going on under the hood without getting your hands dirty. For that reason in case of any accuracy
issues you must provide the following for analysis:
* Who are you, where are you from and why are you doing that. We don't like dealing with anonymous
* The complete and exact description of the system you want to build - what is it going to do, what do you want to build
* The precise description of hardware you are trying to run the system on
* The detailed list of software versions you are using
* Audio samples to demonstrate the problem together with the reference transcription for those samples
Remember, the more information you provide the faster you get a solution.
View File
+75
View File
@@ -0,0 +1,75 @@
# Models
This is the list of models compatible with Vosk-API.
To add a new model here create an issue on Github.
### English
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [kaldi-en-us-aspire-0.1](http://alphacephei.com/kaldi/kaldi-en-us-aspire-0.1.tar.gz) | 363M | TBD | Trained on Fisher + more or less recent LM. Pretty outdated but still ok even even for calls |
| [alphacep-model-android-en-us-0.3](http://alphacephei.com/kaldi/alphacep-model-android-en-us-0.3.tar.gz) | 36M | TBD | Lightweight wideband model for Android and RPi |
### Chinese
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [kaldi-cn-0.1.tar.gz](http://alphacephei.com/kaldi/kaldi-cn-0.1.tar.gz) | 195M | TBD | Big narrowband Chinese model for server processing |
| [alphacep-model-android-cn-0.3](http://alphacephei.com/kaldi/alphacep-model-android-cn-0.3.tar.gz) | 32M | TBD | Lightweight wideband model for Android and RPi |
### Russian
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [kaldi-ru-0.10.tar.gz](http://alphacephei.com/kaldi/kaldi-ru-0.10.tar.gz) | 2.5G | TBD | Big narrowband Russian model for server processing |
| [alphacep-model-android-ru-0.3](http://alphacephei.com/kaldi/alphacep-model-android-ru-0.3.tar.gz) | 39M | TBD | Lightweight wideband model for Android and RPi |
### French
| Model | Size | Accuracy | Notes |
|-------------------------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [alphacep-model-android-fr-pguyot-0.3](http://alphacephei.com/kaldi/alphacep-model-android-fr-pguyot-0.3.tar.gz) | 39M | TBD | Lightweight wideband model for Android and RPi trained by [Paul Guyot](https://github.com/pguyot/zamia-speech/releases) |
### German
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|------------------------------------------------------------------------------------------------------|
| [tuda-de](http://ltdata1.informatik.uni-hamburg.de/kaldi_tuda_de/de_400k_nnet3chain_tdnn1f_2048_sp_bi.tar.bz2) | 566M | TBD | Wideband server model from [tuda-de](https://github.com/uhh-lt/kaldi-tuda-de) |
| [alphacep-model-android-de-zamia-0.3](http://alphacephei.com/kaldi/alphacep-model-android-de-zamia-0.3.tar.gz) | 49M | TBD | Lightweight wideband model for Android and RPi |
### Spanish
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [alphacep-model-android-es-0.3](http://alphacephei.com/kaldi/alphacep-model-android-es-0.3.tar.gz) | 33M | TBD | Lightweight wideband model for Android and RPi |
### Portuguese
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [alphacep-model-android-pt-0.3](http://alphacephei.com/kaldi/alphacep-model-android-pt-0.3.tar.gz) | 31M | TBD | Lightweight wideband model for Android and RPi |
### Dutch
https://github.com/opensource-spraakherkenning-nl/Kaldi_NL
### Greek
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [kaldi-el-gr-0.6.tar.gz](http://alphacephei.com/kaldi/kaldi-el-gr-0.6.tar.gz) | 1.1G | TBD | Big narrowband Greek model for server processing, not extremely accurate though |
### Turkish
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [alphacep-model-android-tr-0.3](http://alphacephei.com/kaldi/alphacep-model-android-tr-0.3.tar.gz) | 35M | TBD | Lightweight wideband model for Android and RPi |
### Vietnamese
| Model | Size | Accuracy | Notes |
|-----------------------------------------------------------------------------------------------------------|-------|------------|----------------------------------------------------------------------------------------------|
| [alphacep-model-android-vn-0.3](http://alphacephei.com/kaldi/alphacep-model-android-vn-0.3.tar.gz) | 32M | TBD | Lightweight wideband model for Android and RPi |
+3
View File
@@ -0,0 +1,3 @@
This is a baseline for the vosk-api iOS demo. It requires a build of a
Vosk-API library, mail contact@alphacephei.com for the details.
+477
View File
@@ -0,0 +1,477 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
92375222240C550B00DD6076 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92375221240C550B00DD6076 /* AppDelegate.swift */; };
92375224240C550B00DD6076 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92375223240C550B00DD6076 /* ViewController.swift */; };
92375227240C550B00DD6076 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 92375225240C550B00DD6076 /* Main.storyboard */; };
92375229240C550B00DD6076 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 92375228240C550B00DD6076 /* Assets.xcassets */; };
9237522C240C550B00DD6076 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9237522A240C550B00DD6076 /* LaunchScreen.storyboard */; };
92375234240C558900DD6076 /* Vosk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92375233240C558900DD6076 /* Vosk.swift */; };
9237523C240C642000DD6076 /* libkaldiwrap.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9237523A240C642000DD6076 /* libkaldiwrap.a */; };
92375244240C6DAF00DD6076 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92375243240C6DAF00DD6076 /* Accelerate.framework */; };
92375246240C6DC900DD6076 /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 92375245240C6DC900DD6076 /* libstdc++.tbd */; };
92375266240C6EFE00DD6076 /* disambig_tid.int in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375248240C6E3D00DD6076 /* disambig_tid.int */; };
92375267240C6EFE00DD6076 /* final.mdl in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375249240C6E3D00DD6076 /* final.mdl */; };
92375268240C6EFE00DD6076 /* Gr.fst in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9237524A240C6E3D00DD6076 /* Gr.fst */; };
92375269240C6EFE00DD6076 /* HCLr.fst in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9237524B240C6E3D00DD6076 /* HCLr.fst */; };
9237526A240C6EFE00DD6076 /* mfcc.conf in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375253240C6E3D00DD6076 /* mfcc.conf */; };
9237526B240C6EFE00DD6076 /* word_boundary.int in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375254240C6E3D00DD6076 /* word_boundary.int */; };
9237526C240C6EFE00DD6076 /* words.txt in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375255240C6E3D00DD6076 /* words.txt */; };
9237526E240C6F1500DD6076 /* final.dubm in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9237524D240C6E3D00DD6076 /* final.dubm */; };
9237526F240C6F1500DD6076 /* final.ie in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9237524E240C6E3D00DD6076 /* final.ie */; };
92375270240C6F1500DD6076 /* final.mat in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9237524F240C6E3D00DD6076 /* final.mat */; };
92375271240C6F1500DD6076 /* global_cmvn.stats in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375250240C6E3D00DD6076 /* global_cmvn.stats */; };
92375272240C6F1500DD6076 /* online_cmvn.conf in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375251240C6E3D00DD6076 /* online_cmvn.conf */; };
92375273240C6F1500DD6076 /* splice.conf in CopyFiles */ = {isa = PBXBuildFile; fileRef = 92375252240C6E3D00DD6076 /* splice.conf */; };
92375274240C6F1E00DD6076 /* 10001-90210-01803.wav in Resources */ = {isa = PBXBuildFile; fileRef = 92375256240C6E3D00DD6076 /* 10001-90210-01803.wav */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
92375265240C6ECF00DD6076 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "model-en";
dstSubfolderSpec = 7;
files = (
92375266240C6EFE00DD6076 /* disambig_tid.int in CopyFiles */,
92375267240C6EFE00DD6076 /* final.mdl in CopyFiles */,
92375268240C6EFE00DD6076 /* Gr.fst in CopyFiles */,
92375269240C6EFE00DD6076 /* HCLr.fst in CopyFiles */,
9237526A240C6EFE00DD6076 /* mfcc.conf in CopyFiles */,
9237526B240C6EFE00DD6076 /* word_boundary.int in CopyFiles */,
9237526C240C6EFE00DD6076 /* words.txt in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9237526D240C6F0400DD6076 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "model-en/ivector";
dstSubfolderSpec = 7;
files = (
9237526E240C6F1500DD6076 /* final.dubm in CopyFiles */,
9237526F240C6F1500DD6076 /* final.ie in CopyFiles */,
92375270240C6F1500DD6076 /* final.mat in CopyFiles */,
92375271240C6F1500DD6076 /* global_cmvn.stats in CopyFiles */,
92375272240C6F1500DD6076 /* online_cmvn.conf in CopyFiles */,
92375273240C6F1500DD6076 /* splice.conf in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
9237521E240C550B00DD6076 /* VoskApiTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VoskApiTest.app; sourceTree = BUILT_PRODUCTS_DIR; };
92375221240C550B00DD6076 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
92375223240C550B00DD6076 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
92375226240C550B00DD6076 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
92375228240C550B00DD6076 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
9237522B240C550B00DD6076 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
9237522D240C550B00DD6076 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
92375233240C558900DD6076 /* Vosk.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Vosk.swift; sourceTree = "<group>"; };
9237523A240C642000DD6076 /* libkaldiwrap.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libkaldiwrap.a; sourceTree = "<group>"; };
92375243240C6DAF00DD6076 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
92375245240C6DC900DD6076 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; };
92375248240C6E3D00DD6076 /* disambig_tid.int */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = disambig_tid.int; sourceTree = "<group>"; };
92375249240C6E3D00DD6076 /* final.mdl */ = {isa = PBXFileReference; lastKnownFileType = file; path = final.mdl; sourceTree = "<group>"; };
9237524A240C6E3D00DD6076 /* Gr.fst */ = {isa = PBXFileReference; lastKnownFileType = file; path = Gr.fst; sourceTree = "<group>"; };
9237524B240C6E3D00DD6076 /* HCLr.fst */ = {isa = PBXFileReference; lastKnownFileType = file; path = HCLr.fst; sourceTree = "<group>"; };
9237524D240C6E3D00DD6076 /* final.dubm */ = {isa = PBXFileReference; lastKnownFileType = file; path = final.dubm; sourceTree = "<group>"; };
9237524E240C6E3D00DD6076 /* final.ie */ = {isa = PBXFileReference; lastKnownFileType = file; path = final.ie; sourceTree = "<group>"; };
9237524F240C6E3D00DD6076 /* final.mat */ = {isa = PBXFileReference; lastKnownFileType = file; path = final.mat; sourceTree = "<group>"; };
92375250240C6E3D00DD6076 /* global_cmvn.stats */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = global_cmvn.stats; sourceTree = "<group>"; };
92375251240C6E3D00DD6076 /* online_cmvn.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = online_cmvn.conf; sourceTree = "<group>"; };
92375252240C6E3D00DD6076 /* splice.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = splice.conf; sourceTree = "<group>"; };
92375253240C6E3D00DD6076 /* mfcc.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mfcc.conf; sourceTree = "<group>"; };
92375254240C6E3D00DD6076 /* word_boundary.int */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = word_boundary.int; sourceTree = "<group>"; };
92375255240C6E3D00DD6076 /* words.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = words.txt; sourceTree = "<group>"; };
92375256240C6E3D00DD6076 /* 10001-90210-01803.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = "10001-90210-01803.wav"; sourceTree = "<group>"; };
92AA22AD244CDD1200DA464B /* vosk_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vosk_api.h; sourceTree = "<group>"; };
92AA22AE244CDD5200DA464B /* bridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bridging.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
9237521B240C550B00DD6076 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
92375246240C6DC900DD6076 /* libstdc++.tbd in Frameworks */,
92375244240C6DAF00DD6076 /* Accelerate.framework in Frameworks */,
9237523C240C642000DD6076 /* libkaldiwrap.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
92375215240C550A00DD6076 = {
isa = PBXGroup;
children = (
92375239240C642000DD6076 /* Vosk */,
92375220240C550B00DD6076 /* VoskApiTest */,
9237521F240C550B00DD6076 /* Products */,
92375242240C6DAF00DD6076 /* Frameworks */,
);
sourceTree = "<group>";
};
9237521F240C550B00DD6076 /* Products */ = {
isa = PBXGroup;
children = (
9237521E240C550B00DD6076 /* VoskApiTest.app */,
);
name = Products;
sourceTree = "<group>";
};
92375220240C550B00DD6076 /* VoskApiTest */ = {
isa = PBXGroup;
children = (
92AA22AE244CDD5200DA464B /* bridging.h */,
92375221240C550B00DD6076 /* AppDelegate.swift */,
92375223240C550B00DD6076 /* ViewController.swift */,
92375225240C550B00DD6076 /* Main.storyboard */,
92375228240C550B00DD6076 /* Assets.xcassets */,
9237522A240C550B00DD6076 /* LaunchScreen.storyboard */,
9237522D240C550B00DD6076 /* Info.plist */,
92375233240C558900DD6076 /* Vosk.swift */,
);
path = VoskApiTest;
sourceTree = "<group>";
};
92375239240C642000DD6076 /* Vosk */ = {
isa = PBXGroup;
children = (
92375247240C6E3D00DD6076 /* model-android */,
92375256240C6E3D00DD6076 /* 10001-90210-01803.wav */,
92AA22AD244CDD1200DA464B /* vosk_api.h */,
9237523A240C642000DD6076 /* libkaldiwrap.a */,
);
name = Vosk;
path = VoskApiTest/Vosk;
sourceTree = "<group>";
};
92375242240C6DAF00DD6076 /* Frameworks */ = {
isa = PBXGroup;
children = (
92375245240C6DC900DD6076 /* libstdc++.tbd */,
92375243240C6DAF00DD6076 /* Accelerate.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
92375247240C6E3D00DD6076 /* model-android */ = {
isa = PBXGroup;
children = (
92375248240C6E3D00DD6076 /* disambig_tid.int */,
92375249240C6E3D00DD6076 /* final.mdl */,
9237524A240C6E3D00DD6076 /* Gr.fst */,
9237524B240C6E3D00DD6076 /* HCLr.fst */,
9237524C240C6E3D00DD6076 /* ivector */,
92375253240C6E3D00DD6076 /* mfcc.conf */,
92375254240C6E3D00DD6076 /* word_boundary.int */,
92375255240C6E3D00DD6076 /* words.txt */,
);
path = "model-android";
sourceTree = "<group>";
};
9237524C240C6E3D00DD6076 /* ivector */ = {
isa = PBXGroup;
children = (
9237524D240C6E3D00DD6076 /* final.dubm */,
9237524E240C6E3D00DD6076 /* final.ie */,
9237524F240C6E3D00DD6076 /* final.mat */,
92375250240C6E3D00DD6076 /* global_cmvn.stats */,
92375251240C6E3D00DD6076 /* online_cmvn.conf */,
92375252240C6E3D00DD6076 /* splice.conf */,
);
path = ivector;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
9237521D240C550B00DD6076 /* VoskApiTest */ = {
isa = PBXNativeTarget;
buildConfigurationList = 92375230240C550B00DD6076 /* Build configuration list for PBXNativeTarget "VoskApiTest" */;
buildPhases = (
9237521A240C550B00DD6076 /* Sources */,
9237521B240C550B00DD6076 /* Frameworks */,
9237521C240C550B00DD6076 /* Resources */,
92375265240C6ECF00DD6076 /* CopyFiles */,
9237526D240C6F0400DD6076 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = VoskApiTest;
productName = VoskApiTest;
productReference = 9237521E240C550B00DD6076 /* VoskApiTest.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
92375216240C550A00DD6076 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0830;
LastUpgradeCheck = 0920;
ORGANIZATIONNAME = "Alpha Cephei";
TargetAttributes = {
9237521D240C550B00DD6076 = {
CreatedOnToolsVersion = 8.3.2;
LastSwiftMigration = 0920;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 92375219240C550A00DD6076 /* Build configuration list for PBXProject "VoskApiTest" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 92375215240C550A00DD6076;
productRefGroup = 9237521F240C550B00DD6076 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
9237521D240C550B00DD6076 /* VoskApiTest */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
9237521C240C550B00DD6076 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
92375274240C6F1E00DD6076 /* 10001-90210-01803.wav in Resources */,
9237522C240C550B00DD6076 /* LaunchScreen.storyboard in Resources */,
92375229240C550B00DD6076 /* Assets.xcassets in Resources */,
92375227240C550B00DD6076 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
9237521A240C550B00DD6076 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
92375224240C550B00DD6076 /* ViewController.swift in Sources */,
92375222240C550B00DD6076 /* AppDelegate.swift in Sources */,
92375234240C558900DD6076 /* Vosk.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
92375225240C550B00DD6076 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
92375226240C550B00DD6076 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
9237522A240C550B00DD6076 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
9237522B240C550B00DD6076 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
9237522E240C550B00DD6076 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.3;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OBJC_BRIDGING_HEADER = bridging.h;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
9237522F240C550B00DD6076 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 10.3;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OBJC_BRIDGING_HEADER = bridging.h;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
92375231240C550B00DD6076 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = VoskApiTest/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/VoskApiTest/Vosk",
);
PRODUCT_BUNDLE_IDENTIFIER = com.alphacephei.VoskApiTest;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_INSTALL_OBJC_HEADER = YES;
SWIFT_OBJC_BRIDGING_HEADER = VoskApiTest/bridging.h;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.0;
};
name = Debug;
};
92375232240C550B00DD6076 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = VoskApiTest/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/VoskApiTest/Vosk",
);
PRODUCT_BUNDLE_IDENTIFIER = com.alphacephei.VoskApiTest;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_INSTALL_OBJC_HEADER = YES;
SWIFT_OBJC_BRIDGING_HEADER = VoskApiTest/bridging.h;
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
92375219240C550A00DD6076 /* Build configuration list for PBXProject "VoskApiTest" */ = {
isa = XCConfigurationList;
buildConfigurations = (
9237522E240C550B00DD6076 /* Debug */,
9237522F240C550B00DD6076 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
92375230240C550B00DD6076 /* Build configuration list for PBXNativeTarget "VoskApiTest" */ = {
isa = XCConfigurationList;
buildConfigurations = (
92375231240C550B00DD6076 /* Debug */,
92375232240C550B00DD6076 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 92375216240C550A00DD6076 /* Project object */;
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:VoskApiTest.xcodeproj">
</FileRef>
</Workspace>
+46
View File
@@ -0,0 +1,46 @@
//
// AppDelegate.swift
// VoskApiTest
//
// Created by Niсkolay Shmyrev on 01.03.20.
// Copyright © 2020 Alpha Cephei. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
}
@@ -0,0 +1,98 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="VoskApiTest" customModuleProvider="target" sceneMemberID="viewController">
<textView key="view" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" editable="NO" textAlignment="natural" id="CtX-mx-X98">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
<connections>
<outlet property="mainText" destination="CtX-mx-X98" id="oJy-5J-NKp"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="32.799999999999997" y="32.833583208395808"/>
</scene>
</scenes>
</document>
+45
View File
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
+34
View File
@@ -0,0 +1,34 @@
//
// ViewController.swift
// VoskApiTest
//
// Created by Niсkolay Shmyrev on 01.03.20.
// Copyright © 2020 Alpha Cephei. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet var mainText: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.global(qos: .userInitiated).async {
DispatchQueue.main.async {
self.mainText.text = "Processing file..."
}
let vosk = Vosk()
let res = vosk.recognizeFile()
DispatchQueue.main.async {
self.mainText.text = res
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
+37
View File
@@ -0,0 +1,37 @@
//
// Vosk.swift
// VoskApiTest
//
// Created by Niсkolay Shmyrev on 01.03.20.
// Copyright © 2020 Alpha Cephei. All rights reserved.
//
import Foundation
public final class Vosk {
func recognizeFile() -> String {
var sres = ""
if let resourcePath = Bundle.main.resourcePath {
let modelPath = resourcePath + "/model-en"
let model = vosk_model_new(modelPath);
let recognizer = vosk_recognizer_new(model, 16000.0)
let audioFile = URL(fileURLWithPath: resourcePath + "/10001-90210-01803.wav")
if let data = try? Data(contentsOf: audioFile) {
let _ = data.withUnsafeBytes {
vosk_recognizer_accept_waveform(recognizer, $0, Int32(data.count))
}
let res = vosk_recognizer_final_result(recognizer);
sres = String(validatingUTF8: res!)!;
print(sres);
}
vosk_recognizer_free(recognizer)
vosk_model_free(model)
}
return sres
}
}
+48
View File
@@ -0,0 +1,48 @@
// Copyright 2020 Alpha Cephei Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _VOSK_API_H_
#define _VOSK_API_H_
#ifdef __cplusplus
extern "C" {
#endif
typedef struct VoskModel VoskModel;
typedef struct VoskSpkModel VoskSpkModel;
typedef struct VoskRecognizer VoskRecognizer;
VoskModel *vosk_model_new(const char *model_path);
void vosk_model_free(VoskModel *model);
VoskSpkModel *vosk_spk_model_new(const char *model_path);
void vosk_spk_model_free(VoskSpkModel *model);
VoskRecognizer *vosk_recognizer_new(VoskModel *model, float sample_rate);
VoskRecognizer *vosk_recognizer_new_spk(VoskModel *model, VoskSpkModel *spk_model, float sample_rate);
VoskRecognizer *vosk_recognizer_new_grm(VoskModel *model, float sample_rate, const char *grammar);
int vosk_recognizer_accept_waveform(VoskRecognizer *recognizer, const char *data, int length);
int vosk_recognizer_accept_waveform_s(VoskRecognizer *recognizer, const short *data, int length);
int vosk_recognizer_accept_waveform_f(VoskRecognizer *recognizer, const float *data, int length);
const char *vosk_recognizer_result(VoskRecognizer *recognizer);
const char *vosk_recognizer_partial_result(VoskRecognizer *recognizer);
const char *vosk_recognizer_final_result(VoskRecognizer *recognizer);
void vosk_recognizer_free(VoskRecognizer *recognizer);
#ifdef __cplusplus
}
#endif
#endif /* _VOSK_API_H_ */
+1
View File
@@ -0,0 +1 @@
#import "Vosk/vosk_api.h"
+11 -3
View File
@@ -11,6 +11,7 @@ KALDI_LIBS = \
${KALDI_ROOT}/src/tree/kaldi-tree.a \
${KALDI_ROOT}/src/feat/kaldi-feat.a \
${KALDI_ROOT}/src/lat/kaldi-lat.a \
${KALDI_ROOT}/src/lm/kaldi-lm.a \
${KALDI_ROOT}/src/hmm/kaldi-hmm.a \
${KALDI_ROOT}/src/transform/kaldi-transform.a \
${KALDI_ROOT}/src/cudamatrix/kaldi-cudamatrix.a \
@@ -32,14 +33,16 @@ VOSK_SOURCES = \
../src/model.cc \
../src/model.h \
../src/spk_model.cc \
../src/spk_model.h
../src/spk_model.h \
../src/vosk_api.cc \
../src/vosk_api.h
libvosk_jni.so: $(VOSK_SOURCES)
$(CXX) -shared -o $@ $(CPPFLAGS) $(CFLAGS) $(VOSK_SOURCES) $(KALDI_LIBS)
vosk_wrap.cc: ../src/vosk.i
mkdir -p org/kaldi
swig -I../src -c++ \
swig -c++ -I../src \
-java -package org.kaldi \
-outdir org/kaldi -o $@ $<
@@ -52,6 +55,11 @@ model-en:
tar xf alphacep-model-android-en-us-0.3.tar.gz && rm alphacep-model-android-en-us-0.3.tar.gz
mv alphacep-model-android-en-us-0.3 model-en
run: model-en
model-spk:
wget https://github.com/alphacep/kaldi-android-demo/releases/download/2020-01/alphacep-spk-model-0.3.tar.gz
tar xf alphacep-spk-model-0.3.tar.gz && rm alphacep-spk-model-0.3.tar.gz
mv alphacep-spk-model-0.3 model-spk
run: model-en model-spk
javac test/*.java org/kaldi/*.java
java -Djava.library.path=. -cp . test.DecoderTest
+19
View File
@@ -0,0 +1,19 @@
Java API sample
Doesn't work on Windows or Mac yet, help to prepare the packaged jars is welcome.
For now to try it:
On Linux you can do
1. Build recent kaldi
1. `git clone https://github.com/alphacep/vosk-api`
1. `cd vosk-api/java`
1. `export KALDI_ROOT=<KALDI_ROOT>`
1. `export JAVA_HOME=<JAVA_HOME>`
1. `make`
1. `make run`
For details of the code you can check:
https://github.com/alphacep/vosk-api/blob/master/java/test/DecoderTest.java
+2 -2
View File
@@ -19,14 +19,14 @@ public class DecoderTest {
public static void main(String args[]) throws IOException {
FileInputStream ais = new FileInputStream(new File("../python/example/test.wav"));
Model model = new Model("model-en");
Model model = new Model("model");
SpkModel spkModel = new SpkModel("model-spk");
KaldiRecognizer rec = new KaldiRecognizer(model, spkModel, 16000.0f);
int nbytes;
byte[] b = new byte[4096];
while ((nbytes = ais.read(b)) >= 0) {
if (rec.AcceptWaveform(b, nbytes)) {
if (rec.AcceptWaveform(b)) {
System.out.println(rec.Result());
} else {
System.out.println(rec.PartialResult());
+10 -9
View File
@@ -3,27 +3,27 @@ project(vosk)
set(TOP_SRCDIR "${CMAKE_SOURCE_DIR}/..")
if("x$ENV{WHEEL_FLAGS}" STREQUAL "x")
find_package (Python COMPONENTS Interpreter Development)
find_package (Python3 COMPONENTS Interpreter Development)
else()
# docker case
set(Python_INCLUDE_DIR "")
set(Python_LIBRARY "")
set(Python3_INCLUDE_DIRS "")
set(TOP_SRCDIR "/io")
endif()
set(KALDI_ROOT "$ENV{KALDI_ROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 -DFST_NO_DYNAMIC_LINKING")
include_directories("${TOP_SRCDIR}/src" "${KALDI_ROOT}/src" "${KALDI_ROOT}/tools/openfst/include" ${Python_INCLUDE_DIR})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{WHEEL_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFST_NO_DYNAMIC_LINKING")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{WHEEL_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} -std=c++11")
include_directories("${TOP_SRCDIR}/src" "${KALDI_ROOT}/src" "${KALDI_ROOT}/tools/openfst/include" ${Python3_INCLUDE_DIRS})
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
set_property(SOURCE "${TOP_SRCDIR}/src/vosk.i" PROPERTY CPLUSPLUS ON)
swig_add_library(vosk TYPE SHARED LANGUAGE Python OUTPUT_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" OUTFILE_DIR "."
SOURCES "${TOP_SRCDIR}/src/kaldi_recognizer.cc"
SOURCES "${TOP_SRCDIR}/src/kaldi_recognizer.cc"
"${TOP_SRCDIR}/src/spk_model.cc"
"${TOP_SRCDIR}/src/model.cc"
"${TOP_SRCDIR}/src/vosk_api.cc"
"${TOP_SRCDIR}/src/vosk.i")
swig_link_libraries(vosk
@@ -35,6 +35,7 @@ swig_link_libraries(vosk
${KALDI_ROOT}/src/tree/kaldi-tree.a
${KALDI_ROOT}/src/feat/kaldi-feat.a
${KALDI_ROOT}/src/lat/kaldi-lat.a
${KALDI_ROOT}/src/lm/kaldi-lm.a
${KALDI_ROOT}/src/hmm/kaldi-hmm.a
${KALDI_ROOT}/src/transform/kaldi-transform.a
${KALDI_ROOT}/src/cudamatrix/kaldi-cudamatrix.a
@@ -45,6 +46,6 @@ swig_link_libraries(vosk
${KALDI_ROOT}/tools/openfst/lib/libfst.a
${KALDI_ROOT}/tools/openfst/lib/libfstngram.a
${KALDI_ROOT}/tools/OpenBLAS/libopenblas.a
-lgfortran)
-lgfortran -lstdc++)
set_target_properties(_vosk PROPERTIES LINK_FLAGS_RELEASE -s)
+1 -1
View File
@@ -4,7 +4,7 @@ from vosk import Model, KaldiRecognizer
import sys
import json
model = Model("model-en")
model = Model("model")
rec = KaldiRecognizer(model, 8000)
res = json.loads(rec.FinalResult())
+2 -2
View File
@@ -3,7 +3,7 @@
from vosk import Model, KaldiRecognizer
import os
if not os.path.exists("model-en"):
if not os.path.exists("model"):
print ("Please download the model from https://github.com/alphacep/kaldi-android-demo/releases and unpack as 'model' in the current folder.")
exit (1)
@@ -13,7 +13,7 @@ p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=8000)
stream.start_stream()
model = Model("model-en")
model = Model("model")
rec = KaldiRecognizer(model, 16000)
while True:
+3 -3
View File
@@ -5,8 +5,8 @@ import sys
import os
import wave
if not os.path.exists("model-en"):
print ("Please download the model from https://github.com/alphacep/kaldi-android-demo/releases and unpack as 'model-en' in the current folder.")
if not os.path.exists("model"):
print ("Please download the model from https://github.com/alphacep/kaldi-android-demo/releases and unpack as 'model' in the current folder.")
exit (1)
wf = wave.open(sys.argv[1], "rb")
@@ -14,7 +14,7 @@ if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE
print ("Audio file must be WAV format mono PCM.")
exit (1)
model = Model("model-en")
model = Model("model")
rec = KaldiRecognizer(model, wf.getframerate())
while True:
+1 -1
View File
@@ -7,7 +7,7 @@ import json
import os
import numpy as np
model_path = "model-en"
model_path = "model"
spk_model_path = "model-spk"
if not os.path.exists(model_path):
+3 -3
View File
@@ -5,12 +5,12 @@ import sys
import json
import os
if not os.path.exists("model-en"):
print ("Please download the model from https://github.com/alphacep/kaldi-android-demo/releases and unpack as 'model-en' in the current folder.")
if not os.path.exists("model"):
print ("Please download the model from https://github.com/alphacep/kaldi-android-demo/releases and unpack as 'model' in the current folder.")
exit (1)
model = Model("model-en")
model = Model("model")
# Large vocabulary free form recognition
rec = KaldiRecognizer(model, 16000)
+3 -3
View File
@@ -5,8 +5,8 @@ import sys
import os
import wave
if not os.path.exists("model-en"):
print ("Please download the model from https://github.com/alphacep/kaldi-android-demo/releases and unpack as 'model-en' in the current folder.")
if not os.path.exists("model"):
print ("Please download the model from https://github.com/alphacep/kaldi-android-demo/releases and unpack as 'model' in the current folder.")
exit (1)
wf = wave.open(sys.argv[1], "rb")
@@ -14,7 +14,7 @@ if wf.getnchannels() != 1 or wf.getsampwidth() != 2 or wf.getcomptype() != "NONE
print ("Audio file must be WAV format mono PCM.")
exit (1)
model = Model("model-en")
model = Model("model")
# You can also specify the possible word list
rec = KaldiRecognizer(model, wf.getframerate(), "zero oh one two three four five six seven eight nine")
+1 -1
View File
@@ -7,7 +7,7 @@ with open("README.md", "r") as fh:
setuptools.setup(
name="vosk", # Replace with your own username
version="0.3.3",
version="0.3.6",
author="Alpha Cephei Inc",
author_email="contact@alphacephei.com",
description="API for Kaldi and Vosk",
+27
View File
@@ -0,0 +1,27 @@
#!/usr/bin/python3
from vosk import Model, KaldiRecognizer
import sys
import os
import wave
import json
model = Model("model")
for line in open(sys.argv[1]):
uid, fn = line.split()
wf = wave.open(fn, "rb")
rec = KaldiRecognizer(model, wf.getframerate())
text = ""
while True:
data = wf.readframes(1000)
if len(data) == 0:
break
if rec.AcceptWaveform(data):
jres = json.loads(rec.Result())
text = text + " " + jres['text']
jres = json.loads(rec.FinalResult())
text = text + " " + jres['text']
print (uid + text)
+128 -67
View File
@@ -20,110 +20,144 @@
using namespace fst;
using namespace kaldi::nnet3;
KaldiRecognizer::KaldiRecognizer(Model &model, float sample_frequency) : model_(model), spk_model_(0), sample_frequency_(sample_frequency) {
KaldiRecognizer::KaldiRecognizer(Model *model, float sample_frequency) : model_(model), spk_model_(0), sample_frequency_(sample_frequency) {
feature_pipeline_ = new kaldi::OnlineNnet2FeaturePipeline (model_.feature_info_);
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_.trans_model_, model_.feature_info_.silence_weighting_config, 3);
model_->Ref();
feature_pipeline_ = new kaldi::OnlineNnet2FeaturePipeline (model_->feature_info_);
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_->trans_model_, model_->feature_info_.silence_weighting_config, 3);
g_fst_ = NULL;
decode_fst_ = NULL;
if (!model_.hclg_fst_) {
if (model_.hcl_fst_ && model_.g_fst_) {
decode_fst_ = LookaheadComposeFst(*model_.hcl_fst_, *model_.g_fst_, model_.disambig_);
if (!model_->hclg_fst_) {
if (model_->hcl_fst_ && model_->g_fst_) {
decode_fst_ = LookaheadComposeFst(*model_->hcl_fst_, *model_->g_fst_, model_->disambig_);
} else {
KALDI_ERR << "Can't create decoding graph";
}
}
decoder_ = new kaldi::SingleUtteranceNnet3Decoder(model_.nnet3_decoding_config_,
*model_.trans_model_,
*model_.decodable_info_,
model_.hclg_fst_ ? *model.hclg_fst_ : *decode_fst_,
decoder_ = new kaldi::SingleUtteranceNnet3Decoder(model_->nnet3_decoding_config_,
*model_->trans_model_,
*model_->decodable_info_,
model_->hclg_fst_ ? *model_->hclg_fst_ : *decode_fst_,
feature_pipeline_);
frame_offset_ = 0;
input_finalized_ = false;
spk_feature_ = NULL;
InitRescoring();
}
KaldiRecognizer::KaldiRecognizer(Model &model, float sample_frequency, char const *grammar) : model_(model), spk_model_(0), sample_frequency_(sample_frequency)
KaldiRecognizer::KaldiRecognizer(Model *model, float sample_frequency, char const *grammar) : model_(model), spk_model_(0), sample_frequency_(sample_frequency)
{
feature_pipeline_ = new kaldi::OnlineNnet2FeaturePipeline (model_.feature_info_);
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_.trans_model_, model_.feature_info_.silence_weighting_config, 3);
model_->Ref();
if (model_.hcl_fst_) {
g_fst_.AddState();
g_fst_.SetStart(0);
g_fst_.AddState();
g_fst_.SetFinal(1, fst::TropicalWeight::One());
g_fst_.AddArc(1, StdArc(0, 0, fst::TropicalWeight::One(), 0));
feature_pipeline_ = new kaldi::OnlineNnet2FeaturePipeline (model_->feature_info_);
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_->trans_model_, model_->feature_info_.silence_weighting_config, 3);
g_fst_ = new StdVectorFst();
if (model_->hcl_fst_) {
g_fst_->AddState();
g_fst_->SetStart(0);
g_fst_->AddState();
g_fst_->SetFinal(1, fst::TropicalWeight::One());
g_fst_->AddArc(1, StdArc(0, 0, fst::TropicalWeight::One(), 0));
// Create simple word loop FST
std::stringstream ss(grammar);
std::string token;
stringstream ss(grammar);
string token;
while (std::getline(ss, token, ' ')) {
int32 id = model_.word_syms_->Find(token);
g_fst_.AddArc(0, StdArc(id, id, fst::TropicalWeight::One(), 1));
while (getline(ss, token, ' ')) {
int32 id = model_->word_syms_->Find(token);
g_fst_->AddArc(0, StdArc(id, id, fst::TropicalWeight::One(), 1));
}
ArcSort(&g_fst_, ILabelCompare<StdArc>());
ArcSort(g_fst_, ILabelCompare<StdArc>());
decode_fst_ = LookaheadComposeFst(*model_.hcl_fst_, g_fst_, model_.disambig_);
decode_fst_ = LookaheadComposeFst(*model_->hcl_fst_, *g_fst_, model_->disambig_);
} else {
decode_fst_ = NULL;
KALDI_ERR << "Can't create decoding graph";
}
decoder_ = new kaldi::SingleUtteranceNnet3Decoder(model_.nnet3_decoding_config_,
*model_.trans_model_,
*model_.decodable_info_,
model_.hclg_fst_ ? *model.hclg_fst_ : *decode_fst_,
decoder_ = new kaldi::SingleUtteranceNnet3Decoder(model_->nnet3_decoding_config_,
*model_->trans_model_,
*model_->decodable_info_,
model_->hclg_fst_ ? *model_->hclg_fst_ : *decode_fst_,
feature_pipeline_);
frame_offset_ = 0;
input_finalized_ = false;
spk_feature_ = NULL;
InitRescoring();
}
KaldiRecognizer::KaldiRecognizer(Model *model, SpkModel *spk_model, float sample_frequency) : model_(model), spk_model_(spk_model), sample_frequency_(sample_frequency) {
KaldiRecognizer::KaldiRecognizer(Model &model, SpkModel *spk_model, float sample_frequency) : model_(model), spk_model_(spk_model), sample_frequency_(sample_frequency) {
feature_pipeline_ = new kaldi::OnlineNnet2FeaturePipeline (model_.feature_info_);
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_.trans_model_, model_.feature_info_.silence_weighting_config, 3);
model_->Ref();
spk_model->Ref();
feature_pipeline_ = new kaldi::OnlineNnet2FeaturePipeline (model_->feature_info_);
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_->trans_model_, model_->feature_info_.silence_weighting_config, 3);
decode_fst_ = NULL;
g_fst_ = NULL;
if (!model_.hclg_fst_) {
if (model_.hcl_fst_ && model_.g_fst_) {
decode_fst_ = LookaheadComposeFst(*model_.hcl_fst_, *model_.g_fst_, model_.disambig_);
if (!model_->hclg_fst_) {
if (model_->hcl_fst_ && model_->g_fst_) {
decode_fst_ = LookaheadComposeFst(*model_->hcl_fst_, *model_->g_fst_, model_->disambig_);
} else {
KALDI_ERR << "Can't create decoding graph";
}
}
decoder_ = new kaldi::SingleUtteranceNnet3Decoder(model_.nnet3_decoding_config_,
*model_.trans_model_,
*model_.decodable_info_,
model_.hclg_fst_ ? *model.hclg_fst_ : *decode_fst_,
decoder_ = new kaldi::SingleUtteranceNnet3Decoder(model_->nnet3_decoding_config_,
*model_->trans_model_,
*model_->decodable_info_,
model_->hclg_fst_ ? *model_->hclg_fst_ : *decode_fst_,
feature_pipeline_);
frame_offset_ = 0;
input_finalized_ = false;
spk_feature_ = new OnlineMfcc(spk_model_->spkvector_mfcc_opts);
InitRescoring();
}
KaldiRecognizer::~KaldiRecognizer() {
delete feature_pipeline_;
delete silence_weighting_;
delete decoder_;
delete g_fst_;
delete decode_fst_;
delete spk_feature_;
delete lm_fst_;
model_->Unref();
if (spk_model_)
spk_model_->Unref();
}
void KaldiRecognizer::InitRescoring()
{
if (model_->std_lm_fst_) {
fst::CacheOptions cache_opts(true, 50000);
fst::MapFstOptions mapfst_opts(cache_opts);
fst::StdToLatticeMapper<kaldi::BaseFloat> mapper;
lm_fst_ = new fst::MapFst<fst::StdArc, kaldi::LatticeArc, fst::StdToLatticeMapper<kaldi::BaseFloat> >(*model_->std_lm_fst_, mapper, mapfst_opts);
} else {
lm_fst_ = NULL;
}
}
void KaldiRecognizer::CleanUp()
{
delete silence_weighting_;
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_.trans_model_, model_.feature_info_.silence_weighting_config, 3);
silence_weighting_ = new kaldi::OnlineSilenceWeighting(*model_->trans_model_, model_->feature_info_.silence_weighting_config, 3);
frame_offset_ += decoder_->NumFramesDecoded();
decoder_->InitDecoding(frame_offset_);
@@ -133,7 +167,7 @@ void KaldiRecognizer::UpdateSilenceWeights()
{
if (silence_weighting_->Active() && feature_pipeline_->NumFramesReady() > 0 &&
feature_pipeline_->IvectorFeature() != NULL) {
std::vector<std::pair<int32, BaseFloat> > delta_weights;
vector<pair<int32, BaseFloat> > delta_weights;
silence_weighting_->ComputeCurrentTraceback(decoder_->Decoder());
silence_weighting_->GetDeltaWeights(feature_pipeline_->NumFramesReady(),
frame_offset_ * 3,
@@ -184,14 +218,13 @@ bool KaldiRecognizer::AcceptWaveform(Vector<BaseFloat> &wdata)
spk_feature_->AcceptWaveform(sample_frequency_, wdata);
}
if (decoder_->EndpointDetected(model_.endpoint_config_)) {
if (decoder_->EndpointDetected(model_->endpoint_config_)) {
return true;
}
return false;
}
// Computes an xvector from a chunk of speech features.
static void RunNnetComputation(const MatrixBase<BaseFloat> &features,
const nnet3::Nnet &nnet, nnet3::CachingOptimizingCompiler *compiler,
@@ -208,7 +241,7 @@ static void RunNnetComputation(const MatrixBase<BaseFloat> &features,
output_spec.indexes.resize(1);
request.outputs.resize(1);
request.outputs[0].Swap(&output_spec);
std::shared_ptr<const nnet3::NnetComputation> computation = compiler->Compile(request);
shared_ptr<const nnet3::NnetComputation> computation = compiler->Compile(request);
nnet3::Nnet *nnet_to_update = NULL; // we're not doing any update.
nnet3::NnetComputer computer(nnet3::NnetComputeOptions(), *computation,
nnet, nnet_to_update);
@@ -221,7 +254,6 @@ static void RunNnetComputation(const MatrixBase<BaseFloat> &features,
xvector->CopyFromVec(cu_output.Row(0));
}
void KaldiRecognizer::GetSpkVector(Vector<BaseFloat> &xvector)
{
int num_frames = spk_feature_->NumFramesReady() - frame_offset_ * 3;
@@ -242,8 +274,7 @@ void KaldiRecognizer::GetSpkVector(Vector<BaseFloat> &xvector)
RunNnetComputation(features, spk_model_->speaker_nnet, &compiler, &xvector);
}
std::string KaldiRecognizer::Result()
const char* KaldiRecognizer::Result()
{
if (!input_finalized_) {
@@ -252,35 +283,59 @@ std::string KaldiRecognizer::Result()
}
if (decoder_->NumFramesDecoded() == 0) {
return "{\"text\": \"\"}";
last_result_ = "{\"text\": \"\"}";
return last_result_.c_str();
}
kaldi::CompactLattice clat;
decoder_->GetLattice(true, &clat);
fst::ScaleLattice(fst::LatticeScale(8.0, 10.0), &clat);
if (model_->std_lm_fst_) {
Lattice lat1;
ConvertLattice(clat, &lat1);
fst::ScaleLattice(fst::GraphLatticeScale(-1.0), &lat1);
fst::ArcSort(&lat1, fst::OLabelCompare<kaldi::LatticeArc>());
kaldi::Lattice composed_lat;
fst::Compose(lat1, *lm_fst_, &composed_lat);
fst::Invert(&composed_lat);
kaldi::CompactLattice determinized_lat;
DeterminizeLattice(composed_lat, &determinized_lat);
fst::ScaleLattice(fst::GraphLatticeScale(-1), &determinized_lat);
fst::ArcSort(&determinized_lat, fst::OLabelCompare<kaldi::CompactLatticeArc>());
kaldi::ConstArpaLmDeterministicFst const_arpa_fst(model_->const_arpa_);
kaldi::CompactLattice composed_clat;
kaldi::ComposeCompactLatticeDeterministic(determinized_lat, &const_arpa_fst, &composed_clat);
kaldi::Lattice composed_lat1;
ConvertLattice(composed_clat, &composed_lat1);
fst::Invert(&composed_lat1);
DeterminizeLattice(composed_lat1, &clat);
}
fst::ScaleLattice(fst::LatticeScale(9.0, 10.0), &clat);
CompactLattice aligned_lat;
if (model_.winfo_) {
WordAlignLattice(clat, *model_.trans_model_, *model_.winfo_, 0, &aligned_lat);
if (model_->winfo_) {
WordAlignLattice(clat, *model_->trans_model_, *model_->winfo_, 0, &aligned_lat);
} else {
aligned_lat = clat;
}
MinimumBayesRisk mbr(aligned_lat);
const std::vector<BaseFloat> &conf = mbr.GetOneBestConfidences();
const std::vector<int32> &words = mbr.GetOneBest();
const std::vector<std::pair<BaseFloat, BaseFloat> > &times =
const vector<BaseFloat> &conf = mbr.GetOneBestConfidences();
const vector<int32> &words = mbr.GetOneBest();
const vector<pair<BaseFloat, BaseFloat> > &times =
mbr.GetOneBestTimes();
int size = words.size();
json::JSON obj;
std::stringstream text;
stringstream text;
// Create JSON object
for (int i = 0; i < size; i++) {
json::JSON word;
word["word"] = model_.word_syms_->Find(words[i]);
word["word"] = model_->word_syms_->Find(words[i]);
word["start"] = (frame_offset_ + times[i].first) * 0.03;
word["end"] = (frame_offset_ + times[i].second) * 0.03;
word["conf"] = conf[i];
@@ -289,7 +344,7 @@ std::string KaldiRecognizer::Result()
if (i) {
text << " ";
}
text << model_.word_syms_->Find(words[i]);
text << model_->word_syms_->Find(words[i]);
}
obj["text"] = text.str();
@@ -301,36 +356,39 @@ std::string KaldiRecognizer::Result()
}
}
return obj.dump();
last_result_ = obj.dump();
return last_result_.c_str();
}
std::string KaldiRecognizer::PartialResult()
const char* KaldiRecognizer::PartialResult()
{
json::JSON res;
if (decoder_->NumFramesDecoded() == 0) {
res["partial"] = "";
return res.dump();
last_result_ = res.dump();
return last_result_.c_str();
}
kaldi::Lattice lat;
decoder_->GetBestPath(false, &lat);
std::vector<kaldi::int32> alignment, words;
vector<kaldi::int32> alignment, words;
LatticeWeight weight;
GetLinearSymbolSequence(lat, &alignment, &words, &weight);
std::ostringstream text;
ostringstream text;
for (size_t i = 0; i < words.size(); i++) {
if (i) {
text << " ";
}
text << model_.word_syms_->Find(words[i]);
text << model_->word_syms_->Find(words[i]);
}
res["partial"] = text.str();
return res.dump();
last_result_ = res.dump();
return last_result_.c_str();
}
std::string KaldiRecognizer::FinalResult()
const char* KaldiRecognizer::FinalResult()
{
if (!input_finalized_) {
feature_pipeline_->InputFinished();
@@ -338,6 +396,9 @@ std::string KaldiRecognizer::FinalResult()
decoder_->AdvanceDecoding();
decoder_->FinalizeDecoding();
input_finalized_ = true;
return Result();
} else {
last_result_ = "{\"text\": \"\"}";
return last_result_.c_str();
}
return Result();
}
+12 -8
View File
@@ -31,34 +31,38 @@ using namespace kaldi;
class KaldiRecognizer {
public:
KaldiRecognizer(Model &model, float sample_frequency);
KaldiRecognizer(Model &model, SpkModel *spk_model, float sample_frequency);
KaldiRecognizer(Model &model, float sample_frequency, char const *grammar);
KaldiRecognizer(Model *model, float sample_frequency);
KaldiRecognizer(Model *model, SpkModel *spk_model, float sample_frequency);
KaldiRecognizer(Model *model, float sample_frequency, char const *grammar);
~KaldiRecognizer();
bool AcceptWaveform(const char *data, int len);
bool AcceptWaveform(const short *sdata, int len);
bool AcceptWaveform(const float *fdata, int len);
std::string Result();
std::string FinalResult();
std::string PartialResult();
const char* Result();
const char* FinalResult();
const char* PartialResult();
private:
void InitRescoring();
void CleanUp();
void UpdateSilenceWeights();
bool AcceptWaveform(Vector<BaseFloat> &wdata);
void GetSpkVector(Vector<BaseFloat> &xvector);
Model &model_;
Model *model_;
SingleUtteranceNnet3Decoder *decoder_;
fst::LookaheadFst<fst::StdArc, int32> *decode_fst_;
fst::StdVectorFst g_fst_; // dynamically constructed grammar
fst::StdVectorFst *g_fst_; // dynamically constructed grammar
OnlineNnet2FeaturePipeline *feature_pipeline_;
OnlineSilenceWeighting *silence_weighting_;
SpkModel *spk_model_;
OnlineBaseFeature *spk_feature_;
fst::MapFst<fst::StdArc, kaldi::LatticeArc, fst::StdToLatticeMapper<kaldi::BaseFloat> > *lm_fst_;
float sample_frequency_;
int32 frame_offset_;
bool input_finalized_;
string last_result_;
};
+114 -29
View File
@@ -51,13 +51,29 @@ static void AndroidLogHandler(const LogMessageEnvelope &env, const char *message
}
#endif
Model::Model(const char *model_path) {
Model::Model(const char *model_path) : model_path_str_(model_path) {
#ifdef __ANDROID__
SetLogHandler(AndroidLogHandler);
#endif
const char *usage = "Read the docs";
struct stat buffer;
string am_path = model_path_str_ + "/am/final.mdl";
if (stat(am_path.c_str(), &buffer) == 0) {
ConfigureV2();
} else {
ConfigureV1();
}
ReadDataFiles();
ref_cnt_ = 1;
}
// Old model layout without model configuration file
void Model::ConfigureV1()
{
const char *extra_args[] = {
"--min-active=200",
"--max-active=3000",
@@ -72,48 +88,89 @@ Model::Model(const char *model_path) {
"--endpoint.rule3.min-trailing-silence=1.0",
"--endpoint.rule4.min-trailing-silence=2.0",
};
std::string model_path_str(model_path);
kaldi::ParseOptions po(usage);
kaldi::ParseOptions po("");
nnet3_decoding_config_.Register(&po);
endpoint_config_.Register(&po);
decodable_opts_.Register(&po);
std::vector<const char*> args;
vector<const char*> args;
args.push_back("vosk");
args.insert(args.end(), extra_args, extra_args + sizeof(extra_args) / sizeof(extra_args[0]));
po.Read(args.size(), args.data());
feature_info_.feature_type = "mfcc";
ReadConfigFromFile(model_path_str + "/mfcc.conf", &feature_info_.mfcc_opts);
ReadConfigFromFile(model_path_str_ + "/mfcc.conf", &feature_info_.mfcc_opts);
feature_info_.mfcc_opts.frame_opts.allow_downsample = true; // It is safe to downsample
feature_info_.silence_weighting_config.silence_weight = 1e-3;
feature_info_.silence_weighting_config.silence_phones_str = "1:2:3:4:5:6:7:8:9:10";
feature_info_.silence_weighting_config.silence_phones_str = endpoint_config_.silence_phones;
OnlineIvectorExtractionConfig ivector_extraction_opts;
ivector_extraction_opts.splice_config_rxfilename = model_path_str + "/ivector/splice.conf";
ivector_extraction_opts.cmvn_config_rxfilename = model_path_str + "/ivector/online_cmvn.conf";
ivector_extraction_opts.lda_mat_rxfilename = model_path_str + "/ivector/final.mat";
ivector_extraction_opts.global_cmvn_stats_rxfilename = model_path_str + "/ivector/global_cmvn.stats";
ivector_extraction_opts.diag_ubm_rxfilename = model_path_str + "/ivector/final.dubm";
ivector_extraction_opts.ivector_extractor_rxfilename = model_path_str + "/ivector/final.ie";
ivector_extraction_opts.num_gselect = 5;
ivector_extraction_opts.min_post = 0.025;
ivector_extraction_opts.posterior_scale = 0.1;
ivector_extraction_opts.max_remembered_frames = 1000;
ivector_extraction_opts.max_count = 100;
ivector_extraction_opts.ivector_period = 200;
ivector_extraction_opts.splice_config_rxfilename = model_path_str_ + "/ivector/splice.conf";
ivector_extraction_opts.cmvn_config_rxfilename = model_path_str_ + "/ivector/online_cmvn.conf";
ivector_extraction_opts.lda_mat_rxfilename = model_path_str_ + "/ivector/final.mat";
ivector_extraction_opts.global_cmvn_stats_rxfilename = model_path_str_ + "/ivector/global_cmvn.stats";
ivector_extraction_opts.diag_ubm_rxfilename = model_path_str_ + "/ivector/final.dubm";
ivector_extraction_opts.ivector_extractor_rxfilename = model_path_str_ + "/ivector/final.ie";
feature_info_.use_ivectors = true;
feature_info_.ivector_extractor_info.Init(ivector_extraction_opts);
nnet3_rxfilename_ = model_path_str + "/final.mdl";
hclg_fst_rxfilename_ = model_path_str + "/HCLG.fst";
hcl_fst_rxfilename_ = model_path_str + "/HCLr.fst";
g_fst_rxfilename_ = model_path_str + "/Gr.fst";
disambig_rxfilename_ = model_path_str + "/disambig_tid.int";
word_syms_rxfilename_ = model_path_str + "/words.txt";
winfo_rxfilename_ = model_path_str + "/word_boundary.int";
nnet3_rxfilename_ = model_path_str_ + "/final.mdl";
hclg_fst_rxfilename_ = model_path_str_ + "/HCLG.fst";
hcl_fst_rxfilename_ = model_path_str_ + "/HCLr.fst";
g_fst_rxfilename_ = model_path_str_ + "/Gr.fst";
disambig_rxfilename_ = model_path_str_ + "/disambig_tid.int";
word_syms_rxfilename_ = model_path_str_ + "/words.txt";
winfo_rxfilename_ = model_path_str_ + "/word_boundary.int";
carpa_rxfilename_ = model_path_str_ + "/rescore/G.carpa";
std_fst_rxfilename_ = model_path_str_ + "/rescore/G.fst";
}
void Model::ConfigureV2()
{
kaldi::ParseOptions po("something");
nnet3_decoding_config_.Register(&po);
endpoint_config_.Register(&po);
decodable_opts_.Register(&po);
po.ReadConfigFile(model_path_str_ + "/conf/model.conf");
KALDI_LOG << "Decoding params beam=" << nnet3_decoding_config_.beam <<
" max-active=" << nnet3_decoding_config_.max_active <<
" lattice-beam=" << nnet3_decoding_config_.lattice_beam;
KALDI_LOG << "Silence phones " << endpoint_config_.silence_phones;
feature_info_.feature_type = "mfcc";
ReadConfigFromFile(model_path_str_ + "/conf/mfcc.conf", &feature_info_.mfcc_opts);
feature_info_.mfcc_opts.frame_opts.allow_downsample = true; // It is safe to downsample
feature_info_.silence_weighting_config.silence_weight = 1e-3;
feature_info_.silence_weighting_config.silence_phones_str = endpoint_config_.silence_phones;
OnlineIvectorExtractionConfig ivector_extraction_opts;
ivector_extraction_opts.splice_config_rxfilename = model_path_str_ + "/ivector/splice.conf";
ivector_extraction_opts.cmvn_config_rxfilename = model_path_str_ + "/ivector/online_cmvn.conf";
ivector_extraction_opts.lda_mat_rxfilename = model_path_str_ + "/ivector/final.mat";
ivector_extraction_opts.global_cmvn_stats_rxfilename = model_path_str_ + "/ivector/global_cmvn.stats";
ivector_extraction_opts.diag_ubm_rxfilename = model_path_str_ + "/ivector/final.dubm";
ivector_extraction_opts.ivector_extractor_rxfilename = model_path_str_ + "/ivector/final.ie";
feature_info_.use_ivectors = true;
feature_info_.ivector_extractor_info.Init(ivector_extraction_opts);
nnet3_rxfilename_ = model_path_str_ + "/am/final.mdl";
hclg_fst_rxfilename_ = model_path_str_ + "/graph/HCLG.fst";
hcl_fst_rxfilename_ = model_path_str_ + "/graph/HCLr.fst";
g_fst_rxfilename_ = model_path_str_ + "/graph/Gr.fst";
disambig_rxfilename_ = model_path_str_ + "/graph/disambig_tid.int";
word_syms_rxfilename_ = model_path_str_ + "/graph/words.txt";
winfo_rxfilename_ = model_path_str_ + "/graph/phones/word_boundary.int";
carpa_rxfilename_ = model_path_str_ + "/rescore/G.carpa";
std_fst_rxfilename_ = model_path_str_ + "/rescore/G.fst";
}
void Model::ReadDataFiles()
{
struct stat buffer;
trans_model_ = new kaldi::TransitionModel();
nnet_ = new kaldi::nnet3::AmNnetSimple();
@@ -126,19 +183,19 @@ Model::Model(const char *model_path) {
SetDropoutTestMode(true, &(nnet_->GetNnet()));
nnet3::CollapseModel(nnet3::CollapseModelConfig(), &(nnet_->GetNnet()));
}
decodable_info_ = new nnet3::DecodableNnetSimpleLoopedInfo(decodable_opts_,
nnet_);
struct stat buffer;
if (stat(hclg_fst_rxfilename_.c_str(), &buffer) == 0) {
KALDI_LOG << "Loading HCLG from " << hclg_fst_rxfilename_;
hclg_fst_ = fst::ReadFstKaldiGeneric(hclg_fst_rxfilename_);
hcl_fst_ = NULL;
g_fst_ = NULL;
} else {
KALDI_LOG << "Loading HCL and G from " << hcl_fst_rxfilename_ << " " << g_fst_rxfilename_;
hclg_fst_ = NULL;
hcl_fst_ = fst::StdFst::Read(hcl_fst_rxfilename_);
g_fst_ = fst::StdFst::Read(g_fst_rxfilename_);
ReadIntegerVectorSimple(disambig_rxfilename_, &disambig_);
}
@@ -149,6 +206,7 @@ Model::Model(const char *model_path) {
word_syms_ = g_fst_->OutputSymbols();
}
if (!word_syms_) {
KALDI_LOG << "Loading words from " << word_syms_rxfilename_;
if (!(word_syms_ = fst::SymbolTable::ReadText(word_syms_rxfilename_)))
KALDI_ERR << "Could not read symbol table from file "
<< word_syms_rxfilename_;
@@ -156,11 +214,38 @@ Model::Model(const char *model_path) {
KALDI_ASSERT(word_syms_);
if (stat(winfo_rxfilename_.c_str(), &buffer) == 0) {
KALDI_LOG << "Loading winfo " << winfo_rxfilename_;
kaldi::WordBoundaryInfoNewOpts opts;
winfo_ = new kaldi::WordBoundaryInfo(opts, winfo_rxfilename_);
} else {
winfo_ = NULL;
}
if (stat(carpa_rxfilename_.c_str(), &buffer) == 0) {
KALDI_LOG << "Loading CARPA model from " << carpa_rxfilename_;
std_lm_fst_ = fst::ReadFstKaldi(std_fst_rxfilename_);
fst::Project(std_lm_fst_, fst::PROJECT_OUTPUT);
if (std_lm_fst_->Properties(fst::kILabelSorted, true) == 0) {
fst::ILabelCompare<fst::StdArc> ilabel_comp;
fst::ArcSort(std_lm_fst_, ilabel_comp);
}
ReadKaldiObject(carpa_rxfilename_, &const_arpa_);
} else {
std_lm_fst_ = NULL;
}
}
void Model::Ref()
{
ref_cnt_++;
}
void Model::Unref()
{
ref_cnt_--;
if (ref_cnt_ == 0) {
delete this;
}
}
Model::~Model() {
+24 -9
View File
@@ -32,6 +32,7 @@
#include "rnnlm/rnnlm-utils.h"
using namespace kaldi;
using namespace std;
class KaldiRecognizer;
@@ -39,18 +40,27 @@ class Model {
public:
Model(const char *model_path);
~Model();
void Ref();
void Unref();
protected:
~Model();
void ConfigureV1();
void ConfigureV2();
void ReadDataFiles();
friend class KaldiRecognizer;
std::string nnet3_rxfilename_;
std::string hclg_fst_rxfilename_;
std::string hcl_fst_rxfilename_;
std::string g_fst_rxfilename_;
std::string word_syms_rxfilename_;
std::string winfo_rxfilename_;
std::string disambig_rxfilename_;
string model_path_str_;
string nnet3_rxfilename_;
string hclg_fst_rxfilename_;
string hcl_fst_rxfilename_;
string g_fst_rxfilename_;
string disambig_rxfilename_;
string word_syms_rxfilename_;
string winfo_rxfilename_;
string carpa_rxfilename_;
string std_fst_rxfilename_;
kaldi::OnlineEndpointConfig endpoint_config_;
kaldi::LatticeFasterDecoderConfig nnet3_decoding_config_;
@@ -62,11 +72,16 @@ protected:
kaldi::nnet3::AmNnetSimple *nnet_;
const fst::SymbolTable *word_syms_;
kaldi::WordBoundaryInfo *winfo_;
std::vector<int32> disambig_;
vector<int32> disambig_;
fst::Fst<fst::StdArc> *hclg_fst_;
fst::Fst<fst::StdArc> *hcl_fst_;
fst::Fst<fst::StdArc> *g_fst_;
fst::VectorFst<fst::StdArc> *std_lm_fst_;
kaldi::ConstArpaLm const_arpa_;
int ref_cnt_;
};
#endif /* MODEL_H_ */
+15
View File
@@ -24,4 +24,19 @@ SpkModel::SpkModel(const char *speaker_path) {
SetBatchnormTestMode(true, &speaker_nnet);
SetDropoutTestMode(true, &speaker_nnet);
CollapseModel(nnet3::CollapseModelConfig(), &speaker_nnet);
ref_cnt_ = 1;
}
void SpkModel::Ref()
{
ref_cnt_++;
}
void SpkModel::Unref()
{
ref_cnt_--;
if (ref_cnt_ == 0) {
delete this;
}
}
+5
View File
@@ -27,12 +27,17 @@ class SpkModel {
public:
SpkModel(const char *spk_path);
void Ref();
void Unref();
protected:
friend class KaldiRecognizer;
~SpkModel() {};
kaldi::nnet3::Nnet speaker_nnet;
MfccOptions spkvector_mfcc_opts;
int ref_cnt_;
};
#endif /* SPK_MODEL_H_ */
+75 -32
View File
@@ -1,7 +1,6 @@
%module(package="vosk") vosk
%module(package="vosk", "threads"=1) vosk
%include <typemaps.i>
%include <std_string.i>
#if SWIGPYTHON
%include <pybuffer.i>
@@ -11,39 +10,12 @@
%include <arrays_csharp.i>
#endif
namespace kaldi {
}
#if SWIGPYTHON
%pybuffer_binary(const char *data, int len);
%ignore KaldiRecognizer::AcceptWaveform(const short *sdata, int len);
%ignore KaldiRecognizer::AcceptWaveform(const float *fdata, int len);
%exception {
try {
$action
} catch (kaldi::KaldiFatalError &e) {
PyErr_SetString(PyExc_RuntimeError, const_cast<char*>(e.KaldiMessage()));
SWIG_fail;
} catch (std::exception &e) {
PyErr_SetString(PyExc_RuntimeError, const_cast<char*>(e.what()));
SWIG_fail;
}
}
#endif
#if SWIGJAVA
%apply char *BYTE {const char *data};
%ignore KaldiRecognizer::AcceptWaveform(const short *sdata, int len);
%ignore KaldiRecognizer::AcceptWaveform(const float *fdata, int len);
#endif
%{
#include "kaldi_recognizer.h"
#include "model.h"
#include "spk_model.h"
%}
#if SWIGJAVA
%typemap(javaimports) KaldiRecognizer %{
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@@ -67,6 +39,77 @@ CSHARP_ARRAYS(char, byte)
%apply short INPUT[] {const short *sdata};
#endif
%include "kaldi_recognizer.h"
%include "model.h"
%include "spk_model.h"
%{
#include "vosk_api.h"
typedef struct VoskModel Model;
typedef struct VoskSpkModel SpkModel;
typedef struct VoskRecognizer KaldiRecognizer;
%}
typedef struct {} Model;
typedef struct {} SpkModel;
typedef struct {} KaldiRecognizer;
%extend Model {
Model(const char *model_path) {
return vosk_model_new(model_path);
}
~Model() {
vosk_model_free($self);
}
}
%extend SpkModel {
SpkModel(const char *model_path) {
return vosk_spk_model_new(model_path);
}
~SpkModel() {
vosk_spk_model_free($self);
}
}
%extend KaldiRecognizer {
KaldiRecognizer(Model *model, float sample_rate) {
return vosk_recognizer_new(model, sample_rate);
}
KaldiRecognizer(Model *model, SpkModel *spk_model, float sample_rate) {
return vosk_recognizer_new_spk(model, spk_model, sample_rate);
}
KaldiRecognizer(Model *model, float sample_rate, const char* grammar) {
return vosk_recognizer_new_grm(model, sample_rate, grammar);
}
~KaldiRecognizer() {
vosk_recognizer_free($self);
}
#if SWIGCSHARP
bool AcceptWaveform(const char *data, int len) {
return vosk_recognizer_accept_waveform($self, data, len);
}
bool AcceptWaveform(const short *sdata, int len) {
return vosk_recognizer_accept_waveform_s($self, sdata, len);
}
bool AcceptWaveform(const float *fdata, int len) {
return vosk_recognizer_accept_waveform_f($self, fdata, len);
}
#elif SWIGJAVA
bool AcceptWaveform(const char *data, int len) {
return vosk_recognizer_accept_waveform($self, data, len);
}
#else
int AcceptWaveform(const char *data, int len) {
return vosk_recognizer_accept_waveform($self, data, len);
}
#endif
const char* Result() {
return vosk_recognizer_result($self);
}
const char* PartialResult() {
return vosk_recognizer_partial_result($self);
}
const char* FinalResult() {
return vosk_recognizer_final_result($self);
}
}
+92
View File
@@ -0,0 +1,92 @@
// Copyright 2020 Alpha Cephei Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "vosk_api.h"
#include "kaldi_recognizer.h"
#include "model.h"
#include "spk_model.h"
#include <string.h>
using namespace kaldi;
VoskModel *vosk_model_new(const char *model_path)
{
return (VoskModel *)new Model(model_path);
}
void vosk_model_free(VoskModel *model)
{
((Model *)model)->Unref();
}
VoskSpkModel *vosk_spk_model_new(const char *model_path)
{
return (VoskSpkModel *)new SpkModel(model_path);
}
void vosk_spk_model_free(VoskSpkModel *model)
{
((SpkModel *)model)->Unref();
}
VoskRecognizer *vosk_recognizer_new(VoskModel *model, float sample_rate)
{
return (VoskRecognizer *)new KaldiRecognizer((Model *)model, sample_rate);
}
VoskRecognizer *vosk_recognizer_new_spk(VoskModel *model, VoskSpkModel *spk_model, float sample_rate)
{
return (VoskRecognizer *)new KaldiRecognizer((Model *)model, (SpkModel *)spk_model, sample_rate);
}
VoskRecognizer *vosk_recognizer_new_grm(VoskModel *model, float sample_rate, const char *grammar)
{
return (VoskRecognizer *)new KaldiRecognizer((Model *)model, sample_rate, grammar);
}
int vosk_recognizer_accept_waveform(VoskRecognizer *recognizer, const char *data, int length)
{
return ((KaldiRecognizer *)(recognizer))->AcceptWaveform(data, length);
}
int vosk_recognizer_accept_waveform_s(VoskRecognizer *recognizer, const short *data, int length)
{
return ((KaldiRecognizer *)(recognizer))->AcceptWaveform(data, length);
}
int vosk_recognizer_accept_waveform_f(VoskRecognizer *recognizer, const float *data, int length)
{
return ((KaldiRecognizer *)(recognizer))->AcceptWaveform(data, length);
}
const char *vosk_recognizer_result(VoskRecognizer *recognizer)
{
return ((KaldiRecognizer *)recognizer)->Result();
}
const char *vosk_recognizer_partial_result(VoskRecognizer *recognizer)
{
return ((KaldiRecognizer *)recognizer)->PartialResult();
}
const char *vosk_recognizer_final_result(VoskRecognizer *recognizer)
{
return ((KaldiRecognizer *)recognizer)->FinalResult();
}
void vosk_recognizer_free(VoskRecognizer *recognizer)
{
delete (KaldiRecognizer *)(recognizer);
}
+48
View File
@@ -0,0 +1,48 @@
// Copyright 2020 Alpha Cephei Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _VOSK_API_H_
#define _VOSK_API_H_
#ifdef __cplusplus
extern "C" {
#endif
typedef struct VoskModel VoskModel;
typedef struct VoskSpkModel VoskSpkModel;
typedef struct VoskRecognizer VoskRecognizer;
VoskModel *vosk_model_new(const char *model_path);
void vosk_model_free(VoskModel *model);
VoskSpkModel *vosk_spk_model_new(const char *model_path);
void vosk_spk_model_free(VoskSpkModel *model);
VoskRecognizer *vosk_recognizer_new(VoskModel *model, float sample_rate);
VoskRecognizer *vosk_recognizer_new_spk(VoskModel *model, VoskSpkModel *spk_model, float sample_rate);
VoskRecognizer *vosk_recognizer_new_grm(VoskModel *model, float sample_rate, const char *grammar);
int vosk_recognizer_accept_waveform(VoskRecognizer *recognizer, const char *data, int length);
int vosk_recognizer_accept_waveform_s(VoskRecognizer *recognizer, const short *data, int length);
int vosk_recognizer_accept_waveform_f(VoskRecognizer *recognizer, const float *data, int length);
const char *vosk_recognizer_result(VoskRecognizer *recognizer);
const char *vosk_recognizer_partial_result(VoskRecognizer *recognizer);
const char *vosk_recognizer_final_result(VoskRecognizer *recognizer);
void vosk_recognizer_free(VoskRecognizer *recognizer);
#ifdef __cplusplus
}
#endif
#endif /* _VOSK_API_H_ */
+21 -1
View File
@@ -21,6 +21,7 @@ RUN cd /opt \
&& rm -rf swig-4.0.1.tar.gz swig-4.0.1
ARG OPENBLAS_ARCH=ARMV7
ARG ARM_HARDWARE_OPTS="-mfloat-abi=hard -mfpu=neon"
RUN cd /opt \
&& export OPENFST_CONFIGURE="--enable-static --enable-shared --enable-far --enable-ngram-fsts --enable-lookahead-fsts --with-pic --disable-bin --host=${CROSS_TRIPLE} --build=x86-linux-gnu" \
&& git clone -b lookahead --single-branch https://github.com/alphacep/kaldi \
@@ -31,8 +32,10 @@ RUN cd /opt \
&& make -j 10 openfst \
&& cd /opt/kaldi/src \
&& sed -i "s:TARGET_ARCH=\"\`uname -m\`\":TARGET_ARCH=$(echo $CROSS_TRIPLE|cut -d - -f 1):g" configure \
&& sed -i "s:-mfloat-abi=hard -mfpu=neon:${ARM_HARDWARE_OPTS}:g" makefiles/linux_openblas_arm.mk \
&& sed -i "s: -O1 : -O3 :g" makefiles/linux_openblas_arm.mk \
&& ./configure --mathlib=OPENBLAS --shared --use-cuda=no \
&& make -j 10 online2 \
&& make -j 10 online2 lm \
&& find /opt/kaldi -name "*.o" -exec rm {} \;
RUN cd /opt \
@@ -60,3 +63,20 @@ RUN cd /opt \
&& make -j $(nproc) \
&& make install \
&& rm -rf /opt/cpython-3.7.6 /opt/cpython-3.7.6-cross /opt/v3.7.6.tar.gz
RUN cd /opt \
&& wget -q https://github.com/python/cpython/archive/v3.6.10.tar.gz \
&& tar xf v3.6.10.tar.gz \
&& cp -r cpython-3.6.10 cpython-3.6.10-cross \
&& cd /opt/cpython-3.6.10 \
&& AR=/usr/bin/ar RANLIB=/usr/bin/ranlib CPP=/usr/bin/cpp CXX=/usr/bin/g++ CC=/usr/bin/gcc ./configure --prefix="/opt/python/cp3.6-cp3.6m" \
&& make -j $(nproc) \
&& make install \
&& /opt/python/cp3.6-cp3.6m/bin/pip3 install -U pip \
&& /opt/python/cp3.6-cp3.6m/bin/pip3 install -U wheel \
&& cd /opt/cpython-3.6.10-cross \
&& export PATH=/opt/python/cp3.6-cp3.6m/bin:$PATH \
&& ./configure --prefix=$CROSS_ROOT --with-openssl=$CROSS_ROOT --host=${CROSS_TRIPLE} --build=x86-linux-gnu --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no ac_cv_have_long_long_format=yes \
&& make -j $(nproc) \
&& make install \
&& rm -rf /opt/cpython-3.6.10 /opt/cpython-3.6.10-cross /opt/v3.6.10.tar.gz
+1 -2
View File
@@ -27,7 +27,7 @@ RUN cd /opt \
&& make -j 10 openfst \
&& cd ../src \
&& ./configure --mathlib=OPENBLAS --shared --use-cuda=no \
&& make -j 10 online2 \
&& make -j 10 online2 lm \
&& find /opt/kaldi -name "*.o" -exec rm {} \;
RUN cd /opt \
@@ -37,4 +37,3 @@ RUN cd /opt \
&& ./configure --prefix=/usr && make -j 10 && make install \
&& cd .. \
&& rm -rf swig-4.0.1.tar.gz swig-4.0.1
+5 -1
View File
@@ -4,5 +4,9 @@ set -e
set -x
docker build --build-arg="DOCKCROSS_IMAGE=linux-armv7" --build-arg="OPENBLAS_ARCH=ARMV7" --file Dockerfile.dockcross --tag alphacep/kaldi-dockcross-armv7:latest .
docker build --build-arg="DOCKCROSS_IMAGE=linux-armv6" --build-arg="OPENBLAS_ARCH=ARMV6" --file Dockerfile.dockcross --tag alphacep/kaldi-dockcross-armv6:latest .
docker build --build-arg="DOCKCROSS_IMAGE=linux-armv6" --build-arg="OPENBLAS_ARCH=ARMV6" --build-arg="ARM_HARDWARE_OPTS=" --file Dockerfile.dockcross --tag alphacep/kaldi-dockcross-armv6:latest .
docker build --build-arg="DOCKCROSS_IMAGE=linux-arm64" --build-arg="OPENBLAS_ARCH=ARMV8" --file Dockerfile.dockcross --tag alphacep/kaldi-dockcross-arm64:latest .
docker run --rm -v /home/shmyrev/travis/vosk-api/:/io alphacep/kaldi-dockcross-armv6 /io/travis/build-wheels-dockcross.sh
docker run --rm -v /home/shmyrev/travis/vosk-api/:/io alphacep/kaldi-dockcross-armv7 /io/travis/build-wheels-dockcross.sh
docker run --rm -v /home/shmyrev/travis/vosk-api/:/io alphacep/kaldi-dockcross-arm64 /io/travis/build-wheels-dockcross.sh
+1
View File
@@ -4,3 +4,4 @@ set -e
set -x
docker build --file Dockerfile.manylinux --tag alphacep/kaldi-manylinux:latest .
docker run --rm -e PLAT=manylinux2010_x86_64 -v /home/shmyrev/travis/vosk-api/:/io alphacep/kaldi-manylinux /io/travis/build-wheels.sh
+21 -16
View File
@@ -1,20 +1,25 @@
#!/bin/bash
set -e -x
export KALDI_ROOT=/opt/kaldi
export WHEEL_FLAGS=`$CROSS_ROOT/bin/python3-config --cflags`
export PATH=/opt/python/cp3.7-cp3.7m/bin:$PATH
echo $CROSS_TRIPLE
case $CROSS_TRIPLE in
*arm-*)
export _PYTHON_HOST_PLATFORM=linux-armv6l
;;
*armv7-*)
export _PYTHON_HOST_PLATFORM=linux-armv7l
;;
*aarch64-*)
export _PYTHON_HOST_PLATFORM=linux-aarch64
;;
esac
ORIG_PATH=$PATH
for pyver in 3.6 3.7; do
pip3 wheel /io/python -w /io/wheelhouse
export KALDI_ROOT=/opt/kaldi
export WHEEL_FLAGS=`$CROSS_ROOT/bin/python${pyver}-config --cflags`
export PATH=/opt/python/cp${pyver}-cp${pyver}m/bin:$ORIG_PATH
echo $CROSS_TRIPLE
case $CROSS_TRIPLE in
*arm-*)
export _PYTHON_HOST_PLATFORM=linux-armv6l
;;
*armv7-*)
export _PYTHON_HOST_PLATFORM=linux-armv7l
;;
*aarch64-*)
export _PYTHON_HOST_PLATFORM=linux-aarch64
;;
esac
pip3 wheel /io/python -w /io/wheelhouse
done
+1 -1
View File
@@ -4,7 +4,7 @@ set -e -x
export KALDI_ROOT=/opt/kaldi
# Compile wheels
for pypath in /opt/python/cp3*; do
for pypath in /opt/python/cp3[56789]*; do
export WHEEL_FLAGS=`${pypath}/bin/python3-config --cflags`
mkdir -p /opt/wheelhouse
"${pypath}/bin/pip" wheel /io/python -w /opt/wheelhouse