Lancer un training avec Deepspeech 0.5.0-alpha.11 et Tensorflow v1.13.1

Objectifs

Installer et configurer les modules et fichiers nécessaires pour faire un training avec Deepspeech

Dans ce tutoriel, j’utilise 12 minutes d’enregistrement et 256 fichiers wav. (ce qui n’est pas beaucoup, vous pouvez utiliser le projet Mozilla pour avoir plus de données et vous pouvez aussi participer au projet pour les aider à récolter plus de données !)

Projet Mozilla : https://voice.mozilla.org/fr

Matériel nécessaires

  • Beaucoup de temps !
  • Audacity
  • Un microphone de bonne qualité (J’utilise un blue snowball ICE)
  • un endroit quand même silencieux pour faire les enregistrements
  • un fichier avec beaucoup de phrases, c’est-à-dire, un fichier contenant des phrases qui prennent en moyenne 4 secondes à lire avec un vocabulaire diversifié, ce fichier sera utile pour générer les phrases et les lires (Exemple: https://voice.mozilla.org/fr)
  • Un serveur physique avec beaucoup de RAM et CPU/GPU

Note: Il se peut que cela ne fonctionne pas du premier coup, il faut lire tous les messages d’erreur et les décortiquer, habituellement ils sont assez clair. Dans tous les cas, les fichiers générés sont très custom, alors il est difficile de tout couvrir, n’hésitez pas à poser des questions.

Étape 1 – Installation de SOX

Vous pouvez trouver les fichiers ici : https://sourceforge.net/projects/sox/files/sox/

Sinon pour installer SOX:

wget https://sourceforge.net/projects/sox/files/sox/14.4.2/sox-14.4.2.tar.gz/download
tar -xvzf download
ls
cd sox-*
./configure
 
sudo su
make -s && make install

exit
cd ..

Étape 2 – Installation de Kenlm

Où trouver les fichiers:

https://github.com/kpu/kenlm

ou

https://kheafield.com/code/kenlm/

Installation de l’outil:

wget -O - https://kheafield.com/code/kenlm.tar.gz |tar xz
mkdir kenlm/build
cd kenlm/build
cmake ..
make -j2

cd ../..

Étape 3 – Compiler generate_trie et libdeepspeech

Cette partie est celle où j’ai eu le plus de difficulté à comprendre le fonctionnement avec mon setup,

Étape 3.1 – Cloner les dépendances de tensorflow

Il faut utiliser le repo. de Mozilla:

git clone https://github.com/mozilla/tensorflow.git
cd tensorflow
git checkout r1.13

Pour compiler la version 1.13.1 de tensorflow, nous allons avoir besoin de bazel 0.19.2

https://github.com/bazelbuild/bazel/releases

Cette partie j’ai fini par la faire en mode root:

sudo su

apt-get install pkg-config zip g++ zlib1g-dev unzip python -y

wget https://github.com/bazelbuild/bazel/releases/download/0.19.2/bazel-0.19.2-installer-linux-x86_64.sh
 
chmod +x bazel-0.19.2-installer-linux-x86_64.sh
./bazel-0.19.2-installer-linux-x86_64.sh --user
export PATH="$PATH:$HOME/bin"
cd tensorflow
./configure

Les réponses que j’ai fournie, sont tous NON. et pour les flags, j’ai laissé ceux par défaut.

Je croyais devoir utiliser python 2.7, mais python 3.6 fonctionne aussi, alors je vous recommande d’utiliser python 3.6

Étape 3.2 – Installation de SWIG 4.0

wget https://pilotfiber.dl.sourceforge.net/project/swig/swig/swig-4.0.0/swig-4.0.0.tar.gz
tar -xvzf swig*
cd swig*
./configure
sudo make
sudo make install

Étape 3.3 – Compilation des modules

À la racine de tensorflow et le dossier DeepSpeech/ est à côté,


ln -s ../DeepSpeech/native_client ./

bazel build --config=monolithic -c opt --copt=-O3 --copt="-D_GLIBCXX_USE_CXX11_ABI=0" --copt=-fvisibility=hidden //native_client:libdeepspeech.so //native_client:generate_trie

L’étape du bazel build prend beaucoup de temps, si vous avez beaucoup de CPU, c’est le temp d’allouer le plus possible à la machine…

L’étape 3.3 n’a pas fonctionné du premier coup, voici les erreurs que j’ai eu:

https://stackoverflow.com/questions/51530323/python-h-not-found-building-from-tensorflow-from-source-in-virtualenv

https://github.com/tensorflow/serving/issues/673

https://github.com/tensorflow/tensorflow/issues/327#issuecomment-313846048

Solution peut-être viable

Je ne crois pas que cela ne change quelque chose à la compilation.

Le problème que j’ai eu principalement, est que Python.h n’était pas trouvé. Mais ça peut prendre plusieurs dizaines de minute pour voir l’erreur

Voici ce que j’ai essayé après avoir vu cette erreur

Faire le tout en root et refaire toutes les étapes pour l’installation de bazel
(Dans le vidéo je le fais en root)

sudo su

Installer wheel

pip install wheel

Installer les librairies python 2.7 (mais j’utilise python 3)

sudo apt-get install libpython2.7-dev python-numpy

Dans tous les cas après plusieurs heures, ça a fini par fonctionner …

Étape 4 – L’architecture des fichiers

tgingras@trainer01:~/project/v100$ tree
 .
├── alphabet_v100.txt
├── data_v100.csv
├── vocabulary_v100.txt
└── voices
    └── v100
        ├── 1.wav
        ├── 111.wav
        └── 256.wav
 
2 directories, 149 files

J’ai un dossier qui se nomme v100

il contient:

  • alphabet
    • Ce fichier contient la liste de tous les caractères possibles utiliser dans les fichiers de training.

Voici un exemple:

 
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
1
2
3
4
5
6
7
8
9
0
ê
é
à
ç
ô
û
î
è
ù
â
'
-
ï
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
É
À
Ç
Ô
Û
Î
È
Ù
Â
Ï
Ê
!
?
’

Le fichier alphabet doit être configuré comme suit:

  • la première ligne doit être un ESPACE suivi d’un ENTER
  • la dernière ligne doit seulement être un ENTER
  • N’oubliez pas vos ‘ et les ! et ?
  • N’utilisez pas la ponctuation tel que . et ,

Après avoir suivi cela vous devriez être en business…

  • le fichier vocabulary
    • Il contient toutes les phrases que vous avez lu et envoyer pour ce training.
    • Chaque phrase doit être sur une ligne unique et doit être identique à celle utilisée dans le fichier data,

exemple:

bonjour John comment ça va aujourd'hui ?
Bonsoir John comment ça va aujourd'hui ?
Bonjour John comment a été ta journée ?
  • Le fichier data:
    • ce fichier contient 3 informations:
      • le chemin absolu pour le fichier .wav
      • la taille de ce fichier
      • ce que l’enregistrement contient
    • L’information est séparé par une virgule, donc vos phrases ne peuvent pas contenir de virgules.

Le header du fichier data.csv:

wav_filename,wav_filesize,transcript

Exemple avec le header:

wav_filename,wav_filesize,transcript
/data/v100/audio/1.wav,12345,bonjour John comment ça va aujourd'hui ?
/data/v100/audio/2.wav,54321,Bonsoir John comment ça va aujourd'hui ?
/data/v100/audio/3.wav,23456,Bonjour John comment a été ta journée ?

Maintenant que vous avez ces trois fichiers, il faut générer les 2 derniers,

Générer le trie et le lm.binary

Le fichier lmplz et build_binary se trouve à l’endroit où kenlm a été téléchargé

/home/tgingras/project/v100 -> contient les fichiers pour le training

../kenlm/ -> contient les fichiers de kenlm

tgingras@trainer01:~/project/v100$ pwd
/home/tgingras/project/v100
 
 
tgingras@trainer01:~/project/v100$ ../kenlm/build/bin/./lmplz --text vocabulary_v100.txt --arpa words_v100.arpa --o 5
 
 
tgingras@trainer01:~/project/v100$ ls
alphabet_v100.txt  data_v100.csv  vocabulary_v100.txt  voices  words_v100.arpa
 
 
tgingras@trainer01:~/project/v100$ ../kenlm/build/bin/./build_binary -T -s words_v100.arpa lm_v100.binary
tgingras@trainer01:~/project/v100$ ../kenlm/build/bin/./lmplz --text vocabulary_v100.txt --arpa words_v100.arpa --o 5
 
=== 1/5 Counting and sorting n-grams ===
 
Reading /home/tgingras/project/v100/vocabulary_v100.txt
 
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
 
****************************************************************************************************
 
Unigram tokens 1743 types 526
 
=== 2/5 Calculating and sorting adjusted counts ===
 
Chain sizes: 1:6312 2:644755648 3:1208916864 4:1934266880 5:2820806144
 
Statistics:
 
1 526 D1=0.764706 D2=1.12059 D3+=1.40409
 
2 1151 D1=0.834025 D2=1.47456 D3+=1.7291
 
3 1316 D1=0.898455 D2=1.49218 D3+=2.17066
 
4 1274 D1=0.935385 D2=1.39868 D3+=1.33709
 
5 1133 D1=0.921098 D2=1.51943 D3+=2.0789
 
Memory estimate for binary LM:
 
type     kB
 
probing 120 assuming -p 1.5
 
probing 144 assuming -r models -p 1.5
 
trie     56 without quantization
 
trie     38 assuming -q 8 -b 8 quantization
 
trie     54 assuming -a 22 array pointer compression
 
trie     37 assuming -a 22 -q 8 -b 8 array pointer compression and quantization
 
=== 3/5 Calculating and sorting initial probabilities ===
 
Chain sizes: 1:6312 2:18416 3:26320 4:30576 5:31724
 
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
 
--------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++********************************************************************************####################################################################################################
 
=== 4/5 Calculating and writing order-interpolated probabilities ===
 
Chain sizes: 1:6312 2:18416 3:26320 4:30576 5:31724
 
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
 
--------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++********************************************************************************####################################################################################################
 
=== 5/5 Writing ARPA model ===
 
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
 
--------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++****************************************************************************************************
 
Name:lmplz  VmPeak:6652612 kB   VmRSS:6544 kB   RSSMax:1164492 kB   user:0.14468    sys:2.37515 CPU:2.5199  real:2.57663
 
tgingras@trainer01:~/project/v100$ ls
 
alphabet_v100.txt  data_v100.csv  vocabulary_v100.txt  voices  words_v100.arpa
 
tgingras@trainer01:~/project/v100$ ../kenlm/build/bin/./build_binary -T -s words_v100.arpa lm_v100.binary
 
Reading words_v100.arpa
 
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
 
****************************************************************************************************
 
SUCCESS

Ressources complémentaires:

Maintenant vous êtes prêt pour essayer un training.

Voici mon fichier de training, il doit être exécuté directement à partir du dossier DeepSpeech/
Ce fichier est la clé pour avoir un bon output, vous devez trouver la meilleur méthode pour obtenir un inférence la plus stable et qui fonctionne bien.

fichier train.py

#!/bin/sh
set -xe
if [ ! -f DeepSpeech.py ]; then
    echo "Please make sure you run this from DeepSpeech's top level directory."
    exit 1
fi;
 
python -u DeepSpeech.py \
  --train_files /home/tgingras/project/v100/data_v100.csv \
  --train_batch_size 80 \
  --dev_batch_size 80 \
  --test_batch_size 40 \
  --n_hidden 1024 \
  --epoch 50 \
  --use_seq_length False \
  --report_count 100 \
  --remove_export True \
  --checkpoint_dir /home/tgingras/project/v100/checkpoints/ \
  --export_dir /home/tgingras/project/v100/model_export/ \
  --alphabet_config_path /home/tgingras/project/v100/alphabet_v100.txt \
  --lm_binary_path /home/tgingras/project/v100/lm_v100.binary \
  --lm_trie_path /home/tgingras/project/v100/trie_v100
cd DeepSpeech
.././train.py

Je vous recommande un disque dur dédié pour faire cela, mon 20 Gb a atteint rapidement la limite après avoir fait toutes les étapes …

Vidéos


Laisser un commentaire