Skip to content

Commit

Permalink
Split models (#24)
Browse files Browse the repository at this point in the history
Resolves #15 
Resolves #16 
Resolves #18 
Resolves #19 
Resolves #20 
Resolves #21 
Resolves #23
  • Loading branch information
mmcauliffe authored May 2, 2017
1 parent 5b0dc8b commit 0293e18
Show file tree
Hide file tree
Showing 72 changed files with 1,568 additions and 409 deletions.
36 changes: 36 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
[run]
source = aligner
omit =
*_rc.py
*_ui.py

[report]
exclude_lines =
pragma: no cover
if __name__ == .__main__.:

raise AssertionError
raise NotImplementedError
pass

if sys\.platform
if hasattr\(sys, 'frozen'\):

except ImportError:

if call_back
if stop_check

def run\(self\):

def calc\(self\):

def setResults

if dialog\.exec_():

if not skip_input.*:

if self.debug:

if debug:
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ thirdparty
!thirdparty/*.md
!thirdparty/*.py

*.fst

# C extensions
*.so

Expand Down
6 changes: 0 additions & 6 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,6 @@ install:
- which python
- conda list

before_script:
- ls $HOME/tools/kaldi
- cp -Rf $HOME/tools/kaldi/ thirdparty/bin/
- ls thirdparty/bin
- export LD_LIBRARY_PATH=$HOME/tools/kaldi:$LD_LIBRARY_PATH

# Run test
script:
- travis_wait 120 "coverage run --source=aligner setup.py test"
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,5 @@
The Montreal Forced Aligner is a command line utility for performing forced alignment of speech datasets using Kaldi (http://kaldi-asr.org/).

Please see the documentation http://montreal-forced-aligner.readthedocs.io for installation and usage.

If you run into any issues, please check the [mailing list](https://groups.google.com/forum/#!forum/mfa-users) for fixes/workarounds or to post a new issue.
8 changes: 5 additions & 3 deletions aligner/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
__ver_tuple__ = (__ver_major__, __ver_minor__, __ver_patch__)
__version__ = "%d.%d.%d" % __ver_tuple__

__all__ = ['aligner', 'command_line', 'archive', 'corpus', 'config', 'dictionary', 'exceptions',
'helper', 'multiprocessing', 'textgrid', 'utils']
__all__ = ['aligner', 'command_line', 'models', 'corpus', 'config', 'dictionary', 'exceptions',
'helper', 'multiprocessing', 'textgrid', 'utils', 'g2p']

import aligner.aligner as aligner

import aligner.command_line as command_line

import aligner.archive as archive
import aligner.models as models

import aligner.corpus as corpus

Expand All @@ -28,3 +28,5 @@
import aligner.textgrid as textgrid

import aligner.utils as utils

import aligner.g2p as g2p
16 changes: 13 additions & 3 deletions aligner/aligner/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@

from ..exceptions import NoSuccessfulAlignments

TEMP_DIR = os.path.expanduser('~/Documents/MFA')
from .. import __version__

from ..config import TEMP_DIR


class BaseAligner(object):
Expand Down Expand Up @@ -63,7 +65,7 @@ def __init__(self, corpus, dictionary, output_directory,
if self.corpus.num_jobs != num_jobs:
num_jobs = self.corpus.num_jobs
self.num_jobs = num_jobs
if temp_directory is None:
if not temp_directory:
temp_directory = TEMP_DIR
self.temp_directory = temp_directory
self.call_back = call_back
Expand All @@ -78,6 +80,15 @@ def setup(self):
self.corpus.initialize_corpus(self.dictionary)
print(self.corpus.speaker_utterance_info())

@property
def meta(self):
data = {'phones':sorted(self.dictionary.nonsil_phones),
'version': __version__,
'architecture':'gmm-hmm',
'features':'mfcc+deltas',
}
return data

@property
def mono_directory(self):
return os.path.join(self.temp_directory, 'mono')
Expand Down Expand Up @@ -124,7 +135,6 @@ def export_textgrids(self):
model_directory = self.tri_directory
elif os.path.exists(self.mono_final_model_path):
model_directory = self.mono_directory
print('hello')
convert_ali_to_textgrids(self.output_directory, model_directory, self.dictionary,
self.corpus, self.num_jobs)

Expand Down
18 changes: 8 additions & 10 deletions aligner/aligner/pretrained.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import os
import shutil
from tqdm import tqdm
import time
import re

from .base import BaseAligner, TEMP_DIR, TriphoneFmllrConfig, TriphoneConfig

from ..dictionary import Dictionary
from ..corpus import load_scp, save_scp
from ..exceptions import PronunciationAcousticMismatchError

from ..multiprocessing import (align, calc_fmllr, test_utterances, thirdparty_binary, subprocess,
convert_ali_to_textgrids)
Expand Down Expand Up @@ -41,10 +39,12 @@ class PretrainedAligner(BaseAligner):
Parameters
----------
archive : :class:`~aligner.archive.Archive`
Archive containing the acoustic model and pronunciation dictionary
corpus : :class:`~aligner.corpus.Corpus`
Corpus object for the dataset
dictionary : :class:`~aligner.dictionary.Dictionary`
Dictionary object for the pronunciation dictionary
acoustic_model : :class:`~aligner.models.AcousticModel`
Archive containing the acoustic model and pronunciation dictionary
output_directory : str
Path to directory to save TextGrids
temp_directory : str, optional
Expand All @@ -56,7 +56,7 @@ class PretrainedAligner(BaseAligner):
Specifies a call back function for alignment
'''

def __init__(self, archive, corpus, output_directory,
def __init__(self, corpus, dictionary, acoustic_model, output_directory,
temp_directory=None, num_jobs=3, speaker_independent=False,
call_back=None, debug=False):
self.debug = debug
Expand All @@ -66,11 +66,9 @@ def __init__(self, archive, corpus, output_directory,
self.output_directory = output_directory
self.corpus = corpus
self.speaker_independent = speaker_independent
self.dictionary = Dictionary(archive.dictionary_path, os.path.join(temp_directory, 'dictionary'),
word_set=corpus.word_set, debug=debug)

self.dictionary = dictionary
self.setup()
archive.export_triphone_model(self.tri_directory)
acoustic_model.export_triphone_model(self.tri_directory)
log_dir = os.path.join(self.tri_directory, 'log')
os.makedirs(log_dir, exist_ok=True)

Expand Down
12 changes: 6 additions & 6 deletions aligner/aligner/trainable.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from .base import BaseAligner

from ..archive import Archive
from ..models import AcousticModel


class TrainableAligner(BaseAligner):
Expand Down Expand Up @@ -55,13 +55,13 @@ def save(self, path):
'''
directory, filename = os.path.split(path)
basename, _ = os.path.splitext(filename)
archive = Archive.empty(basename)
archive.add_triphone_model(self.tri_fmllr_directory)
archive.add_triphone_fmllr_model(self.tri_fmllr_directory)
archive.add_dictionary(self.dictionary)
acoustic_model = AcousticModel.empty(basename)
acoustic_model.add_meta_file(self)
acoustic_model.add_triphone_model(self.tri_fmllr_directory)
acoustic_model.add_triphone_fmllr_model(self.tri_fmllr_directory)
os.makedirs(directory, exist_ok=True)
basename, _ = os.path.splitext(path)
archive.dump(basename)
acoustic_model.dump(basename)
print('Saved model to {}'.format(path))

def _do_tri_training(self):
Expand Down
Loading

0 comments on commit 0293e18

Please sign in to comment.