VOSK test_simple.py on GoogleColaboratory [001]


#VOSK

中国語の機械学習の学習済みの言語モデルを使いたかったので、ローカルで機能する **VOSK** をセットアップしてみた。
**GoogleColab** に。（この記事の一番下にあります、それは。）

日本語の音声認識をしたいところですが、日本語のモデルがあるのか、無いのか、今のところ行きついていないのと、[言語学習モデルを作るというための日本語コーパスも入手難です](https://laboro.ai/activity/column/engineer/eg-laboro-tv-corpus-jp/)ので、言語の形態の近い韓国語、ちょっとは近い中国語、トルコ語、噂によるとタミル語など、そういったとこの人が関わっているものの方が、ひょっとしたらゆっくりでも進展があるのかな？と感じているところです（ただ単に、お気持ち。deep learning での音声認識についての）。

このページの記事では、もともと VOSK のインストールの説明として紹介されている `.py` のファイルをターミナルで python3 コマンドで呼び出す入力待ち受け方式（というのかな、`pythom3 ./test_simple.py test.wav`みたいにコマンドでやるやつのことです）のサンプルプログラムを、googlecolab(jupyter) 用に実行できるように変えたということです。
VOSK 自体がどういうものかわからなかったので、とりあえず googlecolab 上で VOSK が動作するところまでです、この記事の範囲は。
できることがわかれば、次に展開していくつもりです。
今は全くの無知な地点に立っています。

<details><summary>**VOSK** については、たまたま[この youtube ](https://youtu.be/eHUhrBRqADI)を見かけたので、気になっていたのですが、</summary>
<div>

Baido の [DeepSpeech](https://qiita.com/dauuricus/items/63f5604080846ca25868) モデルの mozilla 版のセットアップまでを先にやっていました（ちなみにですが、mozilla 版ではない DeepSpeech2 on PaddlePaddle というものもありましたが、おそらくロマン語系の人は Chinese, Korean, Japanese についてはあまり介入してないので、言語モデルについて、どう違ってどう同じなのか確認しにくいと思います。不明です。）。
セットアップの過程までで deepspeech 0.9.3 には中国語の学習済み言語モデルがあるなと見てましたが、日本語に関しては未だわかりません、あるのかもしれないし、ドキュメント等を掘りださないとわかりませんが、mozilla のプロジェクトのスレッドを見ると、どれだけ情報があるのか探すには、スレッドを時系列たどっていくので、知りたいことがわかるまで時間がかかりそうです。（かかります。）
![IMG_20210223_013515_496.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/e48785aa-2bd0-8742-a931-aec65f09fce9.jpeg)

https://svail.github.io/mandarin/
https://discourse.mozilla.org/t/how-can-i-process-chinese-mandarin-speech-recognition/62884/7

例えばということで、[YouTube にあった `zh-Hans` :Chinese (simplified) の字幕ありの動画から字幕とその翻訳をテキストへ、音声から deepspeech で中国語の学習済み言語モデルを使って音声認識してみるテスト](https://qiita.com/dauuricus/private/eda0cf1d4710f583e7f4) googlecolabの形式。

</div></details>

そもそも日本語の音から意味への落とし込みは英語とは違うようになるのが自然なような気もするし、どこまで最適化できるのかが想像つきませんから、音、ピンインから言葉の意味へ推移する中国語の音声認識のクオリティが良ければ、そちらの方が近いのではないかと想像しますが、まだスタート地点前です、わかりません。

##VOSK とは
https://alphacephei.com/vosk/

>Vosk是言语识别工具包。Vosk最好的事情是：

>1. 支持十七种语言 - 中文，英语，印度英语，德语，法语，西班牙语，葡萄牙语，俄语，土耳其语， 越南语，意大利语，荷兰人，加泰罗尼亚语，阿拉伯, 希腊语, 波斯语, 菲律宾语
2. 移动设备上脱机工作-Raspberry Pi，Android，iOS
3. 使用简单的 pip3 install vosk 安装
4. 每种语言的手提式模型只有是50Mb, 但还有更大的服务器模型可用
5. 提供流媒体API，以提供最佳用户体验（与流行的语音识别python包不同）
6. 还有用于不同编程语言的包装器-java / csharp / javascript等
7. 可以快速重新配置词汇以实现最佳准确性
8. 支持说话人识别

[model](https://alphacephei.com/vosk/models)

#Simple test on GoogleColab

for testing [test_simple.py](https://alphacephei.com/vosk/install) on GoogleColab
[動作までの流れ YouTube](https://youtu.be/keTCUb-KXxI)

ディレクトリの移動、チェンジディレクトリ＝`cd`と、ムーブかな？＝`mv`をどうするか、googlecolab でターミナルコマンドを使うときの詳細がわからなかったけど、`%cd`と`%mv`で期待通りの代替できました。python のコードでもなんとかるのかもしれないけども、今のところ大した知識はないのでそれでいい。

また、googlecolab のストレージのファイルありのフォルダを消すには、jupyter セルの中で、

```bash
!rm -rf フォルダ名
```

とセルを実行すると、ファイルありのフォルダも消せました。これは正しいのかどうか知りませんが、今のところその他の方法を知りません。なぜか、googlecolab の GUI でのフォルダ操作だとパーミッション操作までできないので、フォルダにファイルが存在していると、フォルダごと消すことができないため、圧縮ファイルが階層深くフォルダとファイルに展開されていると、つまりたくさんフォルダがあって、そのほとんどが必要ないって場合に、GUI でファイル操作して削除していくのはきっと大変でしょう。なので、ディレクトリ移動＝`%cd`しつつ、`!rm`で削除していくことになると思います。これも、他にいい方法があるやもしれない。

ぐらいですかね、よくわからないのは。

（追記）
`%%bash`や`sed`などいろいろ方法があるそうです。
https://qiita.com/funatsufumiya/items/e455ab8d801af6e1415d

RAW カメラについての本を読んでいて、本からのリンクで、おいしそうなひとの hatenadiary に上のリンクがあったのですが、そのリンク元にも TIPS が紹介されているのでここにもリンクを置いておきます。
https://karaage.hatenadiary.jp/entry/2018/03/21/073000


```python:googlecolab

"""google colab cell 01
"""

!pip install vosk

!git clone https://github.com/alphacep/vosk-api

%cd vosk-api/python/example
!wget https://alphacephei.com/kaldi/models/vosk-model-small-en-us-0.15.zip
!unzip vosk-model-small-en-us-0.15.zip
%mv vosk-model-small-en-us-0.15 model

"""cell 02
"""

!pwd

"""cell 03
"""

#!/usr/bin/env python3

from vosk import Model, KaldiRecognizer, SetLogLevel
from IPython.display import Audio
import sys
import os
import wave

path = '/content/vosk-api/python/example/'

SetLogLevel(0)

if not os.path.exists("model"):
    print ("Please download the model from https://alphacephei.com/vosk/models and unpack as 'model' in the current folder.")
    exit (1)

wf = wave.open(path+'/test.wav',"rb")
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")
rec = KaldiRecognizer(model, wf.getframerate())

while True:
    data = wf.readframes(4000)
    if len(data) == 0:
        break
    if rec.AcceptWaveform(data):
        print(rec.Result())
    else:
        print(rec.PartialResult())

print(rec.FinalResult())

"""cell 04
"""

Audio(path+'/test.wav')
```

もとにした test_simple.py ファイル
`%%bash`で始まるセルは bash コマンドとして実行されます。今のところ。

```bash:googlecolab
%%bash
cat -n /content/vosk-api/python/example/test_simple.py
```


<details><summary>test</summary>
<div>

```terminal:print
{
  "partial" : ""
}
{
  "partial" : ""
}
{
  "partial" : ""
}
{
  "partial" : ""
}
{
  "partial" : ""
}
{
  "partial" : "one"
}
{
  "partial" : "one zero"
}
{
  "partial" : "one zero zero"
}
{
  "partial" : "one zero zero"
}
{
  "partial" : "one zero zero zero"
}
{
  "partial" : "one zero zero zero one"
}
{
  "partial" : "one zero zero zero one"
}
{
  "partial" : "one zero zero zero one"
}
{
  "partial" : "one zero zero zero one"
}
{
  "result" : [{
      "conf" : 1.000000,
      "end" : 1.110000,
      "start" : 0.840000,
      "word" : "one"
    }, {
      "conf" : 1.000000,
      "end" : 1.530000,
      "start" : 1.110000,
      "word" : "zero"
    }, {
      "conf" : 1.000000,
      "end" : 1.920000,
      "start" : 1.530000,
      "word" : "zero"
    }, {
      "conf" : 1.000000,
      "end" : 2.310000,
      "start" : 1.920000,
      "word" : "zero"
    }, {
      "conf" : 1.000000,
      "end" : 2.610000,
      "start" : 2.310000,
      "word" : "one"
    }],
  "text" : "one zero zero zero one"
}
{
  "partial" : ""
}
{
  "partial" : ""
}
{
  "partial" : "nah no"
}
{
  "partial" : "nah no"
}
{
  "partial" : "nah no to"
}
{
  "partial" : "nah no to i know"
}
{
  "partial" : "nah no to i know"
}
{
  "partial" : "nah no to i know"
}
{
  "result" : [{
      "conf" : 0.560920,
      "end" : 4.110000,
      "start" : 3.930000,
      "word" : "nah"
    }, {
      "conf" : 0.616773,
      "end" : 4.290000,
      "start" : 4.110000,
      "word" : "no"
    }, {
      "conf" : 0.693737,
      "end" : 4.560000,
      "start" : 4.290000,
      "word" : "to"
    }, {
      "conf" : 0.498214,
      "end" : 4.620000,
      "start" : 4.560000,
      "word" : "i"
    }, {
      "conf" : 0.785683,
      "end" : 4.980000,
      "start" : 4.620000,
      "word" : "know"
    }],
  "text" : "nah no to i know"
}
{
  "partial" : ""
}
{
  "partial" : ""
}
{
  "partial" : ""
}
{
  "partial" : "zero"
}
{
  "partial" : "zero one"
}
{
  "partial" : "zero one eight six"
}
{
  "partial" : "zero one eight zero"
}
{
  "partial" : "zero one eight zero"
}
{
  "partial" : "zero one eight zero three"
}
{
  "partial" : "zero one eight zero three"
}
{
  "result" : [{
      "conf" : 1.000000,
      "end" : 6.690000,
      "start" : 6.240000,
      "word" : "zero"
    }, {
      "conf" : 1.000000,
      "end" : 6.900000,
      "start" : 6.690000,
      "word" : "one"
    }, {
      "conf" : 1.000000,
      "end" : 7.110000,
      "start" : 6.930000,
      "word" : "eight"
    }, {
      "conf" : 1.000000,
      "end" : 7.500000,
      "start" : 7.110000,
      "word" : "zero"
    }, {
      "conf" : 1.000000,
      "end" : 7.980000,
      "start" : 7.500000,
      "word" : "three"
    }],
  "text" : "zero one eight zero three"
}
```
</div></details>


VOSK_test_simple.ipynb

kaldi ってなにかわからん。

YoavRamon [awesome-kaldi](https://github.com/YoavRamon/awesome-kaldi)