Yurii Paniv commited on
Commit
ecc051b
1 Parent(s): 6452277

Add multi-language support

Browse files
.github/workflows/publish-docker.yml CHANGED
@@ -8,13 +8,20 @@ jobs:
8
  steps:
9
  - name: Check out the repo
10
  uses: actions/checkout@v2
11
- - name: Download model file
12
  uses: dsaltares/fetch-gh-release-asset@master
13
  with:
14
  repo: "robinhad/voice-recognition-ua"
15
- version: "latest"
16
  file: "uk.tflite"
17
  token: ${{ secrets.YOUR_TOKEN }}
 
 
 
 
 
 
 
18
  - name: Push to GitHub Packages
19
  uses: docker/build-push-action@v1
20
  with:
 
8
  steps:
9
  - name: Check out the repo
10
  uses: actions/checkout@v2
11
+ - name: Download Ukrainian model file
12
  uses: dsaltares/fetch-gh-release-asset@master
13
  with:
14
  repo: "robinhad/voice-recognition-ua"
15
+ version: "v0.1"
16
  file: "uk.tflite"
17
  token: ${{ secrets.YOUR_TOKEN }}
18
+ - name: Download English model file
19
+ uses: dsaltares/fetch-gh-release-asset@master
20
+ with:
21
+ repo: "mozilla/DeepSpeech"
22
+ version: "v0.7.3"
23
+ file: "deepspeech-0.7.3-models.tflite"
24
+ token: ${{ secrets.YOUR_TOKEN }}
25
  - name: Push to GitHub Packages
26
  uses: docker/build-push-action@v1
27
  with:
README.md CHANGED
@@ -1,6 +1,10 @@
1
  # voice-recognition-ua
2
- # make sure to download https://github.com/robinhad/voice-recognition-ua/releases/download/0.1/uk.tflite
3
- # before build
 
 
 
 
4
  ```
5
  export FLASK_APP=main.py
6
  flask run
 
1
  # voice-recognition-ua
2
+ How to run:
3
+ 1. Make sure to download:
4
+ 2. https://github.com/robinhad/voice-recognition-ua/releases/download/0.1/uk.tflite
5
+ 3. https://github.com/mozilla/DeepSpeech/releases/download/v0.7.3/deepspeech-0.7.3-models.tflite
6
+
7
+ How to launch:
8
  ```
9
  export FLASK_APP=main.py
10
  flask run
client.py CHANGED
@@ -89,10 +89,18 @@ class VersionAction(argparse.Action):
89
  exit(0)
90
 
91
 
92
- def client(audio_file):
93
  model_load_start = timer()
94
  # sphinx-doc: python_ref_model_start
95
- ds = Model("./uk.tflite")
 
 
 
 
 
 
 
 
96
  # sphinx-doc: python_ref_model_stop
97
  model_load_end = timer() - model_load_start
98
  print('Loaded model in {:.3}s.'.format(model_load_end), file=sys.stderr)
 
89
  exit(0)
90
 
91
 
92
+ def client(audio_file, lang="uk"):
93
  model_load_start = timer()
94
  # sphinx-doc: python_ref_model_start
95
+ model_path = "uk.tflite"
96
+ if lang not in ["en", "uk"]:
97
+ lang = "uk"
98
+ if lang == "uk":
99
+ model_path = "./uk.tflite"
100
+ if lang == "en":
101
+ model_path = "./deepspeech-0.7.3-models.tflite"
102
+ print(lang)
103
+ ds = Model(model_path)
104
  # sphinx-doc: python_ref_model_stop
105
  model_load_end = timer() - model_load_start
106
  print('Loaded model in {:.3}s.'.format(model_load_end), file=sys.stderr)
main.py CHANGED
@@ -13,10 +13,11 @@ def index():
13
  @app.route('/recognize', methods=["POST"])
14
  def recognize():
15
  file = request.files['file']
 
16
  audio = BytesIO()
17
  file.save(audio)
18
  audio.seek(0)
19
- result = client(audio)
20
  return result
21
 
22
 
 
13
  @app.route('/recognize', methods=["POST"])
14
  def recognize():
15
  file = request.files['file']
16
+ lang = request.form["lang"]
17
  audio = BytesIO()
18
  file.save(audio)
19
  audio.seek(0)
20
+ result = client(audio, lang)
21
  return result
22
 
23
 
static/main.js CHANGED
@@ -8,6 +8,7 @@ var AudioContext = window.AudioContext || window.webkitAudioContext;
8
  var audioContext; //audio context to help us record
9
  const resultNode = document.getElementById('result');
10
  const actionButton = document.getElementById('action');
 
11
 
12
  function resultProcess(data) {
13
  resultNode.textContent = `Довжина тексту: ${data.length} \n
@@ -21,6 +22,7 @@ function exportWAV(blob) {
21
  actionButton.textContent = "Обробляється..."
22
  var data = new FormData()
23
  data.append('file', blob);
 
24
  fetch(`./recognize`, { method: "POST", body: data })
25
  .then(response => response.text())
26
  .then(resultProcess);
@@ -29,7 +31,8 @@ function record() {
29
 
30
  var constraints = { audio: true, video: false }
31
  navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
32
- actionButton.textContent = "Запис..."
 
33
  actionButton.disabled = true;
34
  /*
35
  create an audio context after getUserMedia is called
 
8
  var audioContext; //audio context to help us record
9
  const resultNode = document.getElementById('result');
10
  const actionButton = document.getElementById('action');
11
+ const langSelector = document.getElementById('lang');
12
 
13
  function resultProcess(data) {
14
  resultNode.textContent = `Довжина тексту: ${data.length} \n
 
22
  actionButton.textContent = "Обробляється..."
23
  var data = new FormData()
24
  data.append('file', blob);
25
+ data.append("lang", langSelector.value);
26
  fetch(`./recognize`, { method: "POST", body: data })
27
  .then(response => response.text())
28
  .then(resultProcess);
 
31
 
32
  var constraints = { audio: true, video: false }
33
  navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
34
+ actionButton.textContent = "Запис...";
35
+ resultNode.textContent = "";
36
  actionButton.disabled = true;
37
  /*
38
  create an audio context after getUserMedia is called
templates/hello.html CHANGED
@@ -11,11 +11,23 @@
11
 
12
  <body>
13
  <div class="container">
14
- <div class="text-center">
15
  <h1>Демо розпізнавання української мови</h1>
16
  <p>Говоріть 3 секунди після натискання на кнопку, тоді отримаєте результат</p>
17
- <button class="btn btn-primary" id="action" onclick="handleAction()">Почати запис (3 сек)</button>
18
  <div id="result"></div>
 
 
 
 
 
 
 
 
 
 
 
 
19
  </div>
20
  </div>
21
  <script src="https://cdn.rawgit.com/mattdiamond/Recorderjs/08e7abd9/dist/recorder.js"></script>
 
11
 
12
  <body>
13
  <div class="container">
14
+ <div class="col-12 col-md-8 col-sm-12 col-xl-6 mx-auto text-center">
15
  <h1>Демо розпізнавання української мови</h1>
16
  <p>Говоріть 3 секунди після натискання на кнопку, тоді отримаєте результат</p>
17
+
18
  <div id="result"></div>
19
+ <div class="row no-gutters">
20
+ <div class="col-1 col-sm-2">&nbsp;</div>
21
+ <div class="col-6">
22
+ <button class="btn btn-primary" id="action" onclick="handleAction()">Почати запис (3 сек)</button>
23
+ </div>
24
+ <div class="col-5 col-sm-4">
25
+ <select id="lang" class="browser-default custom-select">
26
+ <option selected value="uk">Українська</option>
27
+ <option value="en">Англійська</option>
28
+ </select>
29
+ </div>
30
+ </div>
31
  </div>
32
  </div>
33
  <script src="https://cdn.rawgit.com/mattdiamond/Recorderjs/08e7abd9/dist/recorder.js"></script>