VoxForge
1) в файле описания указано название файла *ira_ru0* но таких файлов не существует. Необходимо заменить на ira_ru0 на ira_ru_0
2) из файла описания необходимо убрать следующие имена файлов:
ego-20100205-one/wav/ru_0012
ego-20100205-one/wav/ru_0013
ego-20100205-one/wav/ru_0014
ego-20100205-one/wav/ru_0015
ego-20100205-one/wav/ru_0016
ego-20100205-one/wav/ru_0017
так как этих файлов не существует
3) в описании "пофранцузски" заменить на "по-французски"
"чтото" на "что-то"
4) в словаре посторяются некторые слова и есть знак "+"
Ещё не удалось собрать РАБОЧУЮ голосовую модель используя выложенный sphinx_train.cfg
програма предложила использовать следующие параметры
CFG_FEATURE = "1s_12c_12d_3p_12dd"
CFG_STATESPERHMM = 5
после этого модель собралась но не работает
ошибка такая:
FATAL_ERROR: "fe_sigproc.c", line 397: WTF, 4218.750000 < -15.625000 > 4765.625000
возможно из-за того что rate не указал в файле feat.params, разбираюсь...
ещё вопрос: Если я добавляю ещё голосовые файлы, то всю процедуру надо повторить или есть возможность "доучить"?
я использовал программу с пакетом unimrcp которая использует библиотеки pocketshinx 0.6.1
что касаемо вашего эксперимента думаю проблема в лангвистической модели. в ней чего-то не хватает
я поднимал эту проблему здесь:
http://www.voxforge.org/home/forums/other-languages/russian/----4
для тесрирования вам видимо придётся установить shinx3 и кодировку koi8-r
либо попробовать подсунуть собственную мини модель языка (grammar словарь) для pocketshinx (unimrcp так и делает)
вот его пример, на котором я как раз тестировал (кодировку только одинаковую установите для словарей)
содержание файла cmudict.jsgf:
#JSGF V1.0;
grammar camera;
public <camera> = ( <doo1> | <doo2> );
<doo1> = <do1> ( <cam1> <prenum> <num1> | <num2> <cam1> );
<doo2> = <do2> ( <cam2> <prenum> <num1> | <num3> <cam2> | <allcam> );
<do1> = ( включить | подключить | выключить | отключить | опросить );
<do2> = ( опросить | состояние | статус )+ ;
<cam1> = ( камеру | видео-камеру );
<cam2> = ( камеры | видео-камеры );
<allcam> = ( всех камер | каждой <cam2> );
<prenum> = [ номер ];
<num1> = ( один | два | три | четыре | пять | шесть | семь | восемь | девять );
<num2> = ( первую | вторую | третью | четвертую | пятую | шестую | седьмую | восьмую | девятую );
<num3> = ( первой | второй | третьей | четвертой | пятой | шестой | седьмой | восьмой | девятой );
вот на всякий случай мини-словарь для этой grammar модели
да d aa
нет nn ee t
остроухов a s t r a uu h ay v
остроухова a s t r a uu h ay v a
замир z ay mm i r
лариса l a rr ii s a
номер n oo mm ae r
один a dd ii n
первую pp ee r v ur j u
первой pp ee r v ay j
два d v aa
вторую f t a r uu j u
второй f t a r oo j
три t rr ii
третью t rr ee tt j u
третьей t rr ee tt j ae j
четыре ch i t yy rr e
четвертую ch ae t vv i r t uu j u
четвертой ch i t vv ee r t ay j
пять pp aa tt
пятую pp aa t ur j u
пятой pp i t oo j
шесть sh ee s tt
шестую sh y s t uu j u
шестой sh y s t oo j
семь ss ee mm
седьмую ss i dd m uu j u
седьмой ss i dd m oo j
восемь v oo ss ae mm
восьмую v a ss m uu j u
восьмой v a ss m oo j
девять dd ee vv ae tt
девятую dd i vv aa t ur j u
девятой dd i vv aa t ay j
десять dd ee ss ae tt
десятую dd i ss aa t ur j u
десятой dd i ss aa t ay j
включить f k ll ur ch ae tt
выключить v yy k ll ur ch ae tt
подключить p a t k ll ur ch ae tt
отключить a t k ll ur ch ae tt
опросить a p r a ss ii tt
состояние s ay s t a j aa nn ae j e
статус s t aa t ur s
всех f ss ee h
камер k aa mm ae r
каждой k aa zh d ay j
камеру k aa mm ae r u
камеры k aa mm ae r y
видео-камеру vv ii dd e oo k aa mm ae r u
видео-камеры vv ii dd e oo k aa mm ae r y
вот результат тестирования:
msu_ru_nsh.cd_cont_1000_8gau_8000:
INFO: pocketsphinx.c(805): wav/akaalxcoaakaInterocitor-20100322-dqk/wav/ru_0054: к в в он с у быть её в щёки мы у у в в закрытые или (-14444154)
msu_ru_zero.mllt_cd_cont_1000: (с включенным LDA)
INFO: pocketsphinx.c(805): wav/akaalxcoaakaInterocitor-20100322-dqk/wav/ru_0054: в он целует её щёки мы долго мы закрытые веки (-9100920)
msu_ru_zero.cd_cont_1000:
INFO: pocketsphinx.c(805): wav/akaalxcoaakaInterocitor-20100322-dqk/wav/ru_0054: в он целует её щёки мы под в закрытые веки (-10362792)
база слов была ограничена (~150 слов) при помощи grammar словаря
p.s. оригинальный текст:
Он целует её в щёки в лоб в закрытые веки
Я ещё вот чего думаю... если я говорил бы "в лоб", я бы может и сказал "l ay p", но если бы попросили продиктовать для распознавания речи, то использовал бы всё таки звук буквы "б"
> вот результат тестирования:
Тестирование всегда делается на базе 100-200 предложений. Одно ни о чём не говорит. Кроме того, проверять надо на дикторе, не входящем в тренировочную базу
> Я ещё вот чего думаю... если я говорил бы "в лоб", я бы может и сказал "l ay p", но если бы попросили продиктовать для распознавания речи, то использовал бы всё таки звук буквы "б"
я Вас понял, но всё-же на мой вгляд некую субъективную оценку голосовой модели можно получить и иным путём
например берём файл 2008 года
anonymous-20080731-chz/wav/ru_0006 (Глаза ленивые серо-карие и так же как у той женщины с искоркой)
который наверняка использовался для тренировки обеих голосовых моделей
делаем gramm модель примерно на 400 слов произносимых в любом порядке (которая также содержит слова из звукового файла ru_0006)
и тестируем распознавание различными голосовыми моделями
msu_ru_nsh.cd_cont_1000_8gau_8000
весьма долго напрягался pocketsphinx и выдал следующий результат
ru_0006: к в в был на ленивые сердце мой и так же как вот мы чем в над под той
msu_ru_zero.cd_cont_1000
по каким-то причинам гораздо быстрее произошло распознавание и выдался следующий результат
ru_0006: в глаза ленивые серо-карие сеть так же по тёплый женщины с искоркой
различия на мой взгляд всё-таки видны и можно делать некую оценку
я прослушал akaalxcoaakaInterocitor-20100322-dqk/wav/ru_0054.wav - мне показалось что там именно звук "б"
> 1) 2) 3)
Спасибо, исправили
> 4)
Это не ошибка
> Ещё не удалось собрать РАБОЧУЮ голосовую модель используя выложенный sphinx_train.cfg
С этим я смотрю Вы и сами в состоянии справиться. Главное, больше оптимизма в деле проявлять.
Это Вам Спасибо ;)
в словаре есть "за+ногу", но нет "заногу"
в обучающих фразах:
i -> первая
зеленый -> зелёный
вот скрипт которым я исправляю положение:
#!/usr/bin/perl
use utf8;
my $name = 'msu_ru_zero';
my $infilename = 'ALLPROMPTS';
my $outfilename = $name.'_train.transcription';
my $idsfilename = $name.'_train.fileids';
open(IN, "<$infilename") or die ("need input file name");
open(OUT, ">$outfilename") or die ("need output file name");
open(IDS, ">$idsfilename") or die ("need output file name");
while (my $prompt = <IN>) {
chomp $prompt;
my ($file,$text) = split(/[\s]+/,$prompt,2);
$file =~ s/ira_ru0/ira_ru_0/;
$file =~ s/mfc/wav/;
if ($file =~ /ego-20100205-one\/wav\/ru_0012/) { next; }
if ($file =~ /ego-20100205-one\/wav\/ru_0013/) { next; }
if ($file =~ /ego-20100205-one\/wav\/ru_0014/) { next; }
if ($file =~ /ego-20100205-one\/wav\/ru_0015/) { next; }
if ($file =~ /ego-20100205-one\/wav\/ru_0016/) { next; }
if ($file =~ /ego-20100205-one\/wav\/ru_0017/) { next; }
utf8::decode($text);
$text =~ s/чтото/что-то/g;
$text =~ s/пофранцузски/по-французски/g;
$text =~ s/з\+аногу/заногу/g;
$text =~ s/зеленый/зелёный/g;
$text =~ s/ - / /g;
$text =~ s/ i / первая /g;
$text =~ s/[\,\.\?\!\;\:]/ /g;
$text =~ s/[\s]+/ /g;
$text = lc($text);
utf8::encode($text);
print IDS "$file\n";
my ($dir1,$dir2,$filename) = split(/\//,$file,3);
print OUT "<s> $text </s> ($filename)\n";
}
close(IN);
close(OUT);
close(IDS);