Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.171.45.182] |
|
Сообщ.
#1
,
|
|
|
Тренировочные скрипты HTS-demo_CMU-ARCTIC-SLT, а также новые модификации HTS-demo_CMU-ARCTIC-SLT_STRAIGHT, HTS-demo_CMU-ARCTIC-SLT_FORMANT создавались для среды Linux.
Я считаю этот факт крупным недостатком, тк пользователей Windows значительно больше пользователей Linux. Весь процесс состоит из двух этапов: подготовки тренировочных данных в формате HTS, собственно тренировку и проверку голоса. Я тренирую голос в HTS-demo_CMU-ARCTIC-SLT_STRAIGHT с 2014 г. и могу со 100% уверенностью утверждать, что подготовка данных в Windows невозможна без существенной доработки perl-скриптов из каталога data\script. Кроме того, потребуется некоторое понимание процесса и изучение документации HTS и SPTK. Linux не поможет, хотя желающие могут попробовать. Тема достаточно обширная. Следует начать с установки cygwin и закончить поэтапной заменой всех perl-скриптов на их аналоги в других языках программирования, а также начальной установкой конфигурационных данных. Путь к утилитам sptk, sygwin и тд можно прописать в переменную окружения path или указать полный путь в формате Windows # первый вариант X2X=X2X # основное требование bash из sygwyn - никаких пробелов! SOPR=SOPR MGCEP=MGCEP LPC2LSP=LPC2LSP #второй вариант BCP='c:\usr\local\sptk\bin\bcp.exe' # формат windows BCP='c:/usr/local/sptk/bin/bcp.exe' # формат линукса, так будет работать в bash а в perl может привести к ошибкам ($line='...') Командная строка для запуска скр. подготовки данных: echo "Running a training/synthesis perl script (Training.pl) in background...." c:\usr\local\perl scripts/Training.pl scripts/Config.pm.in > log 2>&1 & pause Далее все подстановки типа $() заменяются на ${}. Исправленный вариант кода генерации скрипта для матлаб: ############ ## start ## ############ straight: # Extracting f0, aperiodicity, and spectra using STRAIGHT mkdir -p wav sp ap f0 frameshift=`expr 1000 \* ${FRAMESHIFT} / ${SAMPFREQ}`; \ echo "path(path,'${STRAIGHT}');" > scripts/extract.m; \ echo "prm.F0frameUpdateInterval=${frameshift};" >> scripts/extract.m; \ echo "prm.F0searchUpperBound=${UPPERF0};" >> scripts/extract.m; \ echo "prm.F0searchLowerBound=${LOWERF0};" >> scripts/extract.m; \ echo "prm.spectralUpdateInterval=${frameshift};" >> scripts/extract.m; \ echo "" >> scripts/extract.m for raw in raw/${DATASET}_${SPEAKER}_*.raw; do \ base=`basename ${raw} .raw`; \ echo ${base}; \ min=`${X2X} +sf ${raw} | ${MINMAX} | ${X2X} +fa | head -n 1`; \ max=`${X2X} +sf ${raw} | ${MINMAX} | ${X2X} +fa | tail -n 1`; \ if [ -s ${raw} -a ${min} -gt -32768 -a ${max} -lt 32767 ]; then \ wav=wav/${base}.wav; \ f0=f0/${base}.f0; \ ap=ap/${base}.ap; \ sp=sp/${base}.sp; \ echo -n "Converting ${raw} to ${wav} and generating MATLAB script..."; \ ${SOX} -c 1 -s -${SOXOPTION} -t raw -r ${SAMPFREQ2} ${raw} -c 1 -s -${SOXOPTION} -t wav -r ${SAMPFREQ} ${wav}; \ echo "fprintf(1,'Processing ${wav}\n');" >> scripts/extract.m; \ echo "[x,fs]=wavread('${wav}');" >> scripts/extract.m; \ echo "[f0, ap] = exstraightsource(x,fs,prm);" >> scripts/extract.m; \ echo "[sp] = exstraightspec(x, f0, fs, prm);" >> scripts/extract.m; \ echo "ap = ap';" >> scripts/extract.m; \ echo "sp = sp';" >> scripts/extract.m; \ echo "save '${f0}' f0 -ascii;" >> scripts/extract.m; \ echo "save '${ap}' ap -ascii;" >> scripts/extract.m; \ echo "save '${sp}' sp -ascii;" >> scripts/extract.m; \ echo "" >> scripts/extract.m; \ echo "done"; \ fi; \ done; \ echo "quit;" copy scripts/extract.m extract.m ${MATLAB} < extract.m #rm -f scripts/extract.m exit; Приведу еще 1 пример скрипта, создающего логарифм основного тона. Кстати, на всех англоязычных ресурсах он упоминается как log, те на первый взгляд это некий лог-файл с данными основного тона. \data\Makefile.in lf0: # Converting f0 to log f0 mkdir -p lf0 for f0 in f0/${DATASET}_${SPEAKER}_*.f0; do \ base=`basename ${f0} .f0`; \ if [ -s ${f0} ]; then \ echo "Converting F0 file ${f0} to log F0 file lf0/${base}.lf0"; \ ${X2X} +af ${f0} > tmp; \ ${PERL} scripts/freq2lfreq.pl tmp > tmp.lf0 if [ -n "`${NAN} lf0/${base}.lf0`" ]; then \ echo " Failed to extract ${f0}"; \ rm -f lf0/${base}.lf0; \ fi; \ fi; \ done rm -f tmp В исходном варианте freq2lfreq.pl добавляет мусор к выходным данным, что можно заметить по неправильному размеру выходных файлов. Это связано с неправильной работой некоторых операторов perl ( unpack и pack ). Во вложении графики основного тона, полученные в матлаб, для 2-х моих вариантов скрипта. После исправления скрипт обрезал часть файла с логарифмом ОТ, так, что синтезированный голос не говорит, а шепчет. В итоге пришлось заменить вызов скрипта freq2lfreq.pl на вызов утилиты sopr из пакета SPTK. График правильный. lf0: # Converting f0 to log f0 mkdir -p lf0 for f0 in f0/${DATASET}_${SPEAKER}_*.f0; do \ base=`basename ${f0} .f0`; \ if [ -s ${f0} ]; then \ echo "Converting F0 file ${f0} to log F0 file lf0/${base}.lf0"; \ ${X2X} +af ${f0} > tmp; \ ${SOPR} –LN tmp > lf0/${base}.lf0; \ if [ -n "`${NAN} lf0/${base}.lf0`" ]; then \ echo " Failed to extract ${f0}"; \ rm -f lf0/${base}.lf0; \ fi; \ fi; \ #exit; done rm -f tmp Прикреплённый файлcmu_slt_a001lf0.rar (10,3 Кбайт, скачиваний: 187) Добавлено Следующие "аксиомы": Формат файлов из каталогов data/ap,sp,f0 - ascii (текстовый формат). Открывается в текстовом редакторе. Формат файлов из каталогов data/lf0, mgc, bap, cmp - float. Открывается в winhex. Формат файлов из каталогов gen\qst001\ver1\1mix\0 - float. Расширения файлов намеренно вводят в заблуждение. Добавлено Теперь смотрим размер файла cmu_us_arctic_slt_a0001.lf0. Он равен 2680 байт. Правый щелчок мыши, свойства, размер в скобках. В файле хранится набор чисел в формате float. Каждое число занимает 4 байта, поэтому, после деления размера файла на 4 получите количество сохраненных значений или точное значение total_frame. Это очень важный параметр. Кстати, этот размер файла одинаков в cmu_us_arctic_slt и cmu_us_arctic_slt_straight, хотя методы разные. Совпадение. |
Сообщ.
#2
,
|
|
|
Команда ${SOPR} –LN tmp > lf0/${base}.lf0; \ записывает f0 вместо логарифма.
Проще вычислять логарифм в матлабе или переписать скрипт freq2lfreq.pl. Во вложении исходный код на с++. Прикреплённый файлfreq2lfreq.rar (25,23 Кбайт, скачиваний: 178) |
Сообщ.
#3
,
|
|
|
Пример обратного восстановления голоса для метода STAIGHT.
Прикреплённый файлfrwav.part1.rar (87,89 Кбайт, скачиваний: 166) Прикреплённый файлfrwav.part2.rar (55,46 Кбайт, скачиваний: 164) Добавлено Восстановление синтезированного голоса для метода STAIGHT - https://www.sendspace.com/file/vsenqe. Общий развмер восстановленных файлов будет ~20MBt Добавлено Вопрос: Зачем нужно восстанавливать речь из тренировочных данных? Ответ: Для оценки качества тренировочных данных и будущего голоса. Следует учитывать, что качество синтезированного голоса будет немного хуже. |
Сообщ.
#4
,
|
|
|
В методе STRAIGHT на расчет bound ap и обратное преобразование тратится много времени. В реальном вокодере приведет к большим вычислительным затратам.
Моно тренировать апы также как sp, путем расчтета их mgc и получать апериодику так же просто, как спектр. |
Сообщ.
#5
,
|
|
|
Апериодика по кепстрам получается "кривая", вместо нормальной речи синтезируется шопот.
Код на матлабе для построения графиков из любого бинарного файла, содержащего набор чисел сплавающей запятой (float, 4Bt) % fread_f0.m % построения графиков из любого бинарного файла, содержащего набор чисел сплавающей запятой (float, 4Bt) % Автор: webcoder88 % clear all; % close all; % infile='E:\_HTS-demo_CMU_STR\data\lf0\cmu_us_arctic_slt_a0001.lf0'; infile='E:\_HTS-demo_CMU_STR\data\cmp\cmu_us_arctic_slt_a0001.cmp'; fid = fopen(infile,'r'); % fid = fopen(infile,'r','ieee-le'); [y, count] = fread(fid,inf,'float32',0,'ieee-le'); %inf - читать до конца файла, count-счетчик успешно прочитанных %значений указанного формата ('ieee-le') %count=filesise/4 for(i=1:count) if (y(i)==-1.0e+010) y(i)=0; end; %fprintf('=%f\n', y(i)); end; count figure; plot(y); grid on; fclose(fid); |
Сообщ.
#6
,
|
|
|
Ссылка на тренированный голос slt (48k) есть в сообщении Синтез речи в hts_engine.exe 1.05
|