На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD, nsh
  
> Адаптация HTS-demo_CMU-ARCTIC-SLT в windows
    Тренировочные скрипты 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



    Далее все подстановки типа $() заменяются на ${}.
    Исправленный вариант кода генерации скрипта для матлаб:


    ExpandedWrap disabled
                  ############
              ##  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
    ExpandedWrap disabled
      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. График правильный.

    ExpandedWrap disabled
      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 Кбайт, скачиваний: 183)

    Добавлено
    Следующие "аксиомы":
    Формат файлов из каталогов 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, хотя методы разные. Совпадение.
      Команда ${SOPR} –LN tmp > lf0/${base}.lf0; \ записывает f0 вместо логарифма.
      Проще вычислять логарифм в матлабе или переписать скрипт freq2lfreq.pl.
      Во вложении исходный код на с++.
      Прикреплённый файлПрикреплённый файлfreq2lfreq.rar (25,23 Кбайт, скачиваний: 171)
        Пример обратного восстановления голоса для метода STAIGHT.
        Прикреплённый файлПрикреплённый файлfrwav.part1.rar (87,89 Кбайт, скачиваний: 163)
        Прикреплённый файлПрикреплённый файлfrwav.part2.rar (55,46 Кбайт, скачиваний: 159)

        Добавлено
        Восстановление синтезированного голоса для метода STAIGHT - https://www.sendspace.com/file/vsenqe.
        Общий развмер восстановленных файлов будет ~20MBt

        Добавлено
        Вопрос: Зачем нужно восстанавливать речь из тренировочных данных?
        Ответ: Для оценки качества тренировочных данных и будущего голоса. Следует учитывать, что качество синтезированного голоса будет немного хуже.
          В методе STRAIGHT на расчет bound ap и обратное преобразование тратится много времени. В реальном вокодере приведет к большим вычислительным затратам.
          Моно тренировать апы также как sp, путем расчтета их mgc и получать апериодику так же просто, как спектр.
            Апериодика по кепстрам получается "кривая", вместо нормальной речи синтезируется шопот.

            Код на матлабе для построения графиков из любого бинарного файла, содержащего набор чисел сплавающей запятой (float, 4Bt)

            ExpandedWrap disabled
              % 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);
            Сообщение отредактировано: webcoder88 -
              Ссылка на тренированный голос slt (48k) есть в сообщении Синтез речи в hts_engine.exe 1.05
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0292 ]   [ 21 queries used ]   [ Generated: 16.04.24, 10:04 GMT ]