Переход к открытым стандартам при обработке речи

Преобразование неструктурированных файлов словарей в формат XML с помощью Python

Многие проекты по разработке ПО с открытым исходным кодом начались еще до появления стандартов свободного и открытого программного обеспечения (СОПО), поэтому их файлы конфигурации и ресурсы представляют собой простые, неструктурированные текстовые файлы. Преобразовав эти файлы в соответствующий открытый стандарт, можно улучшить совместимость, гибкость и надежность смежных проектов. Хорошим примером служит словарь в работах по распознаванию речи. В этой статье рассматривается использование языка Python для преобразования существующих неструктурированных файлов словарей в формат XML, определенный в спецификации Pronunciation Lexicon Specification (PLS), и обратного преобразования новых файлов PLS в неструктурированный файл. Читатель узнает, как использовать формат XML для добавления дополнительной информации и строгости в процесс ведения словарей. Рассматриваются и такие вопросы, как Unicode и слияние нового словаря с другими XML-файлами без потери возможности использования этих данных для генерирования звуковой модели.

Колин Бекингем, исследователь и автор, Freelance

Колин Бекингем (Colin Beckingham) ― независимый исследователь, писатель и программист из Канады. Имеет ученые степени Королевского университета в Кингстоне и Университета Виндзор. Работал в самых разных областях, включая банковские услуги, садоводство, конные скачки, преподавание, гражданскую службу, розничную торговлю, а также путешествия и туризм. Автор приложений на основе баз данных и многочисленных статей в газетах, журналах и в Интернете. В круг его научных интересов входят программирование с открытым исходным кодом, VoIP и управляемые голосом приложения для Linux. Адрес для контактов: colbec@start.ca.



07.08.2012

Введение

Во многих успешных проектах по разработке ПО на протяжении ряда лет без особых проблем используются неструктурированные текстовые файлы конфигурации и ресурсов. Однако по мере роста и усложнения проектов возникает потребность в усилении их строгости и адаптируемости. С помощью XML и применения XML с использованием конкретных стандартов можно получить выгоды от повышенной совместимости между проектами и платформами, надежности и продвижения в таких направлениях, как Unicode.

Используемые сокращения

  • HTK: Hidden Markov Model Toolkit - инструментарий скрытого марковского моделирования (НММ - алгоритм непрерывного распознавания речи);
  • PLS: стандарт Pronunciation Lexicon Specification
  • XML: Extensible Markup Language - расширяемый язык разметки

К тому же, преобразовав неструктурированные текстовые файлы в соответствующий открытый стандарт, можно повысить их гибкость и надежность. Хорошим примером, который используется в этой статье, служит словарь, используемый в работах по распознаванию речи. Независимо от того, переходит ли открытый проект на файлы ресурсов в формате XML, в своей собственной работе можно использовать стандарты на базе XML без потери каких бы то ни было функций.

Эта статья учит легко переходить от неструктурированных файлов к формату Pronunciation Lexicon Specification (PLS) и обратно. Примеры показывают, как сохранить специальные словари в формате PLS и извлекать эти данные в нужный неструктурированный файл.


Пример: словарь

Словари ― это списки слов, которые используются в инструментах распознавания речи. Они содержат информацию о том, как следует печатать слова или отображать их графически и как их озвучить с использованием фонем. В проектах по голосовому управлению словари широко используются с инструментарием скрытого марковского моделирования (HTK) (см. раздел Ресурсы). В листинге 1 приведен фрагмент словаря HTK VoxForge.

Листинг 1. Выдержка из словаря HTK VoxForge
AGENCY  [AGENCY]        ey jh ih n s iy
AGENDA  [AGENDA]        ax jh eh n d ax
AGENT   [AGENT] ey jh ih n t
AGENTS  [AGENTS]        ey jh ih n t s
AGER    [AGER]  ey g er
AGES    [AGES]  ey jh ih z

При копировании и вставке кода из статьи добавляйте знак табуляции

Словари рекомендуется брать непосредственно из исходного кода. Эта статья отображается в формате HTML, где знаки табуляции заменяются пробелами. При копировании и вставке текста из этой статьи несколько пробелов необходимо заменять одним знаком табуляции (\t), иначе сценарий работать не будет.

Файл из листинга 1 содержит три поля, разделенных знаками табуляции:

  • метка общего описания слова;
  • слово в квадратных скобках, как оно должно быть напечатано или воспроизведено на экране (графема);
  • последовательность разделенных пробелом фонем из набора Arpabet (см. раздел Ресурсы), описывающих звучание этого слова.

Приведенный выше пример дает произношение для английского языка, которое легко обозначается символами Американского стандартного кода обмена информацией (ASCII).

В проекте CMU Sphinx (см. раздел Ресурсы) словарь хранится именно таким образом. Выдержка из него показана в листинге 2.

Листинг 2. Выдержка из словаря CMU Sphinx
agency  EY JH AH N S IY
agenda  AH JH EH N D AH
agendas AH JH EH N D AH Z
agent   EY JH AH N T
agents  EY JH AH N T S
ager    EY JH ER

В листинге 2 всего два поля: слово/графема и фонемы его звучания. Между примерами двух словарей имеются некоторые тонкие различия:

  • слова и фонемы набраны в разных регистрах;
  • Фонемы имеют некоторые незначительные различия.
  • Знаки пунктуации (запятая, восклицательный знак и т. д.) обрабатываются немного по-разному.

Весь словарь можно увидеть в файле cmu07a.dic из текущей загрузки PocketSphinx (см. раздел Ресурсы).

Так как в словаре описаны конкретные варианты произношения слов, возможно, потребуется отредактировать файл с учетом особенностей конкретных людей или диалектов. Со временем вы накопите капитал знаний в своем собственном специальном словаре. Неструктурированный файл легко редактировать с помощью текстового редактора, но в него также легко внести ошибки, например, вставить нестандартный разделитель или не-ASCII символ, расположить поля в неправильном порядке, неправильно отсортировать записи, пропустить квадратные скобки и т.п.

У неструктурированных файлов есть еще один недостаток. Создаваемый специальный файл остается несовместимым с другими проектами в области распознавания речи. Словарь в стандартном XML-формате, таком как PLS, если его поддерживают оба проекта, немедленно делает их совместимыми.


Стандарт Pronunciation Lexicon Specification

PLSA имеет простой базовый формат, показанный в листинге 3.

Листинг 3. Базовый формат PLS
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0" 
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon 
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" xml:lang="en-US">
  <lexeme ...>
    <grapheme>...</grapheme>
    <phoneme ...>...</phoneme>
  </lexeme>
</lexicon>

В XML-коде описан корневой элемент lexicon, который может содержать несколько дочерних элементов lexeme. Каждый элемент lexeme может содержать несколько элементов grapheme и несколько элементов phoneme. Спецификация позволяет переопределить атрибут alphabet, но не атрибут языка xml:lang. Для хранения лексем разных языков строго необходимы отдельные PLS-файлы словаря. Алфавитом этого словаря по умолчанию является ipa, который относится к системе международного фонетического алфавита (МФА) для воспроизведения звуков (см. раздел Ресурсы). Фонемы IPA представляются многобайтовыми символами Unicode. В HTK и Sphinx используются неструктурированные коды ASCII. Мы рассмотрим эту важную особенность ниже.

Преимущество использования спецификации PLS заключается в том, что она вносит более жесткую структуру и позволяет хранить больше информации, такой как части речи и конкретные алфавиты. Часть речи - важная деталь для английского языка, потому что некоторые слова, которые пишутся одинаково (омографы), произносятся по-разному в зависимости от их грамматической роли. Например, прилагательное perfect звучит иначе, чем глагол с таким же написанием, потому что ударение делается на другом слоге. Дополнительная информация, хранящаяся в атрибутах, позволяет по мере необходимости извлекать определенные записи из всего файла. Используя этот метод, можно искать определенный алфавит среди множества элементов phoneme.

Словарь PLS можно рассматривать как базу данных словарной информации, содержащую детали для используемых речевых инструментов. В листинге 4 приведен пример в формате PLS.

Листинг 4. Одно слово в формате PLS
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0" 
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon 
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" xml:lang="en">
  <lexeme role="noun">
    <grapheme>agency</grapheme>
    <phoneme alphabet="x-htk-voxforge">ey jh ih n s iy</phoneme>
    <phoneme alphabet="x-cmusphinx">EY JH AH N S IY</phoneme>
  </lexeme>
</lexicon>

Пример, приведенный в листинге 4, содержит всего одно слово, у которого два возможных фонемных представления. Одну из строк phoneme можно отфильтровать, используя атрибут alphabet. Атрибут role элемента lexeme имеет значение noun. Это информативно, но в данном случае излишне, потому что это слово используется только как существительное, так что сценарии произношения не осложняются.

Расположив рядом представления phoneme из двух разных источников, можно заметить более тонкие различия. Эта информация может оказаться полезной при решении задач распознавания речи.

Ни CMU Sphinx, ни HTK не могут использовать словарь PLS напрямую, для этого служит simon, клиент инструментария HTK (см. раздел Ресурсы). Если HTK или Sphinx используются непосредственно, то нужна возможность легко переходить без потери информации от неструктурированного текста к PLS и обратно.

В следующих разделах показано, как с помощью Python получать PLS из неструктурированного файла, и наоборот. Предполагается, что исходная информация содержится в словаре в виде неструктурированного файла.


Преобразование в PLS

Код, приведенный в листинге 5, написан на языке Python, но то же самое можно сделать многими другими способами. (Например, см руководство developerWorks по расширяемому языку преобразования стилей (XSLT) в разделе Ресурсы.) Некоторые хотят использовать библиотеки, которые проверяют надежность XML на каждом незначительные шаге, чтобы немедленно получать обратную связь при наличии проблем, особенно если исходные файлы велики и могут содержать ошибки и несоответствия. В приведенном ниже примере проверка выполняется на последнем шаге, что подразумевает определенный уровень уверенности в правильности неструктурированных файлов.

Листинг 5. Преобразование в PLS
from elementtree.ElementTree import parse
import string as str
import sys
import cgi
#
# вызов 
#	python flat2pls.py vox
# или 
#	python flat2pls.py spx
#
if len(sys.argv) == 2:
  src = sys.argv[1]
else:
  exit("wrong args")
#
outfile = "mylex"+src+".pls"
print "out is "+outfile
out = open(outfile,"w")
out.write('<?xml version="1.0" encoding="UTF-8"?>\n\
<lexicon version="1.0"\n \
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"\n\
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n \
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon\n \
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"\n\
      alphabet="ipa" xml:lang="en">')
# пошли лексемы
if src == "vox":
  f = open("vf.lex","r")
  for line in f:
    line = str.strip(line)
    word = str.split(line,"\t")
    #gr = str.strip(word[1],"[]")
    gr = cgi.escape(word[0])
    out.write('\n\
  <lexeme>\n\
    <grapheme>'+gr+'</grapheme>\n\
    <phoneme alphabet="x-htk-voxforge">'+word[2]+'</phoneme>\n\
  </lexeme>')
else: # src is sphinx
  f = open("cmu.dic","r")
  for line in f:
    line = str.strip(line)
    word = str.split(line,"\t")
    gr = cgi.escape(word[0])
    out.write('\n\
  <lexeme>\n\
    <grapheme>'+gr+'</grapheme>\n\
    <phoneme alphabet="x-cmusphinx">'+word[1]+'</phoneme>\n\
  </lexeme>')
# лексемы закончились
out.write('\n</lexicon>\n')
out.close()
# проверка результата
tree = parse(outfile)
lexicon = tree.getroot()
mylexcount = 0
for lexeme in lexicon:
  mylexcount += 1
print 'Found %(number)d lexemes' % {"number":mylexcount}

Листинг 5 начинается с импорта модулей из XML библиотеки синтаксического анализа elementtree (см. раздел Ресурсы) и некоторых вспомогательных библиотек. При импорте ElementTree из разных дистрибутивов синтаксис может несколько различаться в зависимости от того, как устанавливается модуль. Пример кода взят из openSUSE с модулем, установленным из исходного кода, но для Ubuntu может потребоваться from xml.etree.ElementTree import parse Модуль str допускает некоторые манипуляции со строками, sys предоставляет доступ к файлам, а cgi обеспечивает важную функцию модификации при обработке XML-данных. Предполагается, что код получает аргумент интерфейса командной строки (CLI), указывающий, из какого формата переводить ― CMU Sphinx или HTK/VoxForge. Затем код примера открывает файл для вывода и записывает пролог XML-документа, соответствующий PLS. Так как на данном этапе не сохраняются никакие символы Unicode, достаточно открыть файл только для доступа к неструктурированному ASCII.

На этом этапе код, приведенный в листинге 5:

  • построчно обрабатывает исходный файл, разделяя поля на отдельные строки и записывая компоненты lexeme, grapheme и phoneme;
  • выявляет элементы phoneme с атрибутом alphabet="x-htk-voxforge", если данные поступают из словаря VoxForge, и alphabet="x-cmusphinx", если данные поступают из словаря Sphinx;
  • сохраняет регистр фонем.

При импорте первого поля в нем могут содержаться такие символы, как амперсанд (&), что вызовет проблемы в XML, если их не модифицировать с помощью cgi.escape().

Наконец, код:

  • записывает закрывающие теги;
  • закрывает файл PLS, а затем перезагружает его как файл XML;
  • считывает файл, подсчитывая элементы lexeme;
  • сообщает количество лексем.

Если количество указано, то XML можно считать надежным и правильным.

В листинге 6 приведена выдержка из результирующего словаря VoxForge HTK.

Листинг 6. Фрагмент результирующего словаря VoxForge HTK.
...
<lexeme>
  <grapheme>AGENDA</grapheme>
  <phoneme alphabet="x-htk-voxforge">ax jh eh n d ax</phoneme>
</lexeme>
<lexeme> 
  <grapheme>AGENT</grapheme>
  <phoneme alphabet="x-htk-voxforge">ey jh ih n t</phoneme>
</lexeme>
...

Преобразование из PLS

Важно знать, что можно легко вернуться от формата PLS к неструктурированному файлу. Код, приведенный в листинге 7, предполагает, что словарь хранится в файле PLS и что в проекте по распознаванию речи можно использовать только неструктурированный файл в формате HTK или CMU Sphinx.

Листинг 7. Преобразование из PLS
from elementtree.ElementTree import parse
import string as str
import sys
#
# Вызов 
#	python pls2flat.py x-htk-voxforge > mylexicon
# или 
#	python pls2flat.py x-cmusphinx > mylexicon.dic
#
if len(sys.argv) > 1:
  alpha = sys.argv[1]
#
if alpha == "x-htk-voxforge":
  tree = parse("mylexvox.pls")
else:
  tree = parse("mylexspx.pls")
lexicon = tree.getroot()
for lexeme in lexicon:
  for child in lexeme:
    #Распечатка child.tag
    if child.tag[-8:] == 'grapheme':
      if alpha == 'x-htk-voxforge':
	gr = str.upper(child.text)
	print gr,"\t","["+gr+"]","\t",
      else:
	gr = child.text
	print gr,"\t",
    if child.tag[-7:] == 'phoneme':
      if child.get('alphabet') == alpha:
	print child.text

В этом коротком сценарии для разбора XML-файла PLS используется библиотека elementtree. Он устанавливает корневой элемент, а затем перебирает дочерние лексемы в поисках элементов grapheme и phoneme, записывая значения в текстовой файл в соответствующем формате. Сценарий запрашивает последние восемь знаков тега с элементом grapheme, так как вместе с тегом возвращается префикс пространства имен. Для HTK он воссоздает формат из трех полей, а для CMU Sphinx ― из двух.


Слияние и работа с Unicode

Сценарий, приведенный в листинге 8, создает из двух файлов PLS объединенный файл PLS, содержащий информацию из обоих исходных файлов. Кроме того, он преобразует строку phoneme VoxForge в Unicode и сохраняет Unicode-версию в отдельном элементе phoneme с атрибутом alphabet="ipa".

Листинг 8. Слияние и Unicode
#! /usr/bin/python -u
# -*- coding: utf-8 -*-
#
# задача заключается в объединении двух файлов pls
# даны два файла pls, объединяемые в один
# 
import elementtree.ElementTree as ET
from elementtree.ElementTree import parse
import string as str
import codecs
import cgi
#
treevox = ET.parse("mylexvox.pls")
treespx = ET.parse("mylexspx.pls")
#
lexvox = treevox.getroot()
lexspx = treespx.getroot()
#
phons = { 'aa':u'Й‘','ae':u'Г¦','ah':u'КЊ','ao':u'Й”','ar':u'Й›r','aw':u'aКЉ',
'ax':u'Й™','ay':u'aЙЄ','b':u'b','ch':u'tКѓ','d':u'd','dh':u'Г°','eh':u'Й›',
'el':u'Й”l','en':u'Й‘n','er':u'Й™r','ey':u'eЙЄ','f':u'f',
'g':u'ЙЎ','hh':u'h','ih':u'ЙЄ','ir':u'ЙЄr','iy':u'i','jh':u'dК’','k':u'k','l':u'l',
'm':u'm','n':u'n','ng':u'Е‹','ow':u'oКЉ','oy':u'Й”ЙЄ','p':u'p','r':u'r','s':u's',
'sh':u'Кѓ','t':u't','th':u'Оё','uh':u'КЉ','ur':u'КЉr','uw':u'u','v':u'v',
'w':u'w','y':u'j','z':u'z','zh':u'К’','sil':'' }
#
def to_utf(s):
  myp = str.split(s)
  myipa = []
  for p in myp:
    myipa.append(phons[p])
  return str.join(myipa,'')
#
outfile = "my2lexmrg.pls"
out = codecs.open(outfile, encoding='utf-8', mode='w')
#
out.write('<?xml version="1.0" encoding="UTF-8"?>\n\
<lexicon version="1.0"\n \
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"\n\
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n \
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon\n \
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"\n\
      alphabet="ipa" xml:lang="en">')
#
# сканирование двух pls и создание словаря
voxdict = {}
for lexeme in lexvox:
  gr = str.lower(lexeme[0].text)
  ph = lexeme[1].text
  voxdict[gr] = {ph,}
#
for lexeme in lexspx:
  gr = lexeme[0].text
  ph = lexeme[1].text
  if gr in voxdict:
    voxdict[gr].add(ph)
  else:
    voxdict[gr] = {ph,}
#
for gr in sorted(voxdict.iterkeys()):
  out.write('\n\
  <lexeme>\n\
    <grapheme>'+cgi.escape(gr)+'</grapheme>')
  #print "%s: %s" % (key, voxdict[key])
  for ph in sorted(voxdict[gr]):
    alph = 'x-htk-voxforge' if ph.islower() else 'x-cmusphinx'
    out.write('\n\
    <phoneme alphabet="'+alph+'">'+ph+'</phoneme>')
    if ph.islower():
      phipa = to_utf(ph)
      out.write(u'\n\
    <phoneme alphabet="ipa">'+phipa+'</phoneme>')
  out.write('\n\
  </lexeme>')
# готово, файлы закрываются
out.write('\n</lexicon>')
out.close()
# теперь проверка результата выполнена
tree = parse(outfile)
lexicon = tree.getroot()
mylexcount = 0
for lexeme in lexicon:
  mylexcount += 1
print 'Found %(number)d lexemes' % {"number":mylexcount}

Мы начинаем с выражения hashbang (#!), за которым второй строкой следует специальный индикатор для интерпретатора Python, указывающий на то, что этот код содержит символы Unicode. Затем сценарий импортирует ряд модулей, включая elementtree, codecs и cgi, полезных при работе с Unicode. Мы сообщаем интерпретатору, где находятся файлы PLS, и указываем на их корневые элементы.

Переменная phons хранит специальный словарь, содержащий сопоставление кодов CMU Arpabet с эквивалентным сочетанием Unicode. Этот словарь переводит существующие строки phoneme в Unicode-версию. Это сопоставление можно модифицировать для своих собственных целей — например, указать, что эквивалентом 'aa', признака удлинения звука a в Unicode, является 'ɑ:'.

Для перевода строки ASCII Arpabet в Unicode служит единственная функция to_utf(). На последнем этапе открывается файл для сохранения результата, выполняется проверка того, что этот файл готов принять Unicode, и производится запись в него пролога PLS.

Теперь все готово для обработки файлов путем создания двух специальных внутренних словарей Python, по одному для каждого файла PLS, путем их сканирования с помощью библиотеки elementtree. Предполагается, что grapheme будет первым дочерним элементом лексемы, а phoneme ― вторым. Сценарий добавляет в новый объединенный словарь все записи из первого файла. При сканировании второго файла, если ключ в новом объединенном словаре уже существует, набор фонем наращивается. В противном случае в объединенном словаре создается новый элемент ключа. В конце цикла новый объединенный словарь содержит ключи из оригинальных файлов и соответствующий набор элементов phoneme из одной или двух строк.

Запишем новый файл PLS из только что созданного объединенного файла. Для этого просмотрим словарь, добавляя атрибут alphabet, чтобы отличать один элемент phoneme от другого. Записав существующие фонемы, создадим новую строку phoneme, которая представляет собой Unicode-эквивалент строки CMU Arpabet ― ее можно получить из версии HTK и/или Sphinx.

Наконец, закрываем корневой элемент, закрываем файл и вновь выполняем его разбор для проверки, как мы уже делали.

Результат должен выглядеть как в листинге 9.

Листинг 9. Результат слияния
...
  <lexeme>
    <grapheme>agenda</grapheme>
    <phoneme alphabet="x-cmusphinx">AH JH EH N D AH</phoneme>
    <phoneme alphabet="x-htk-voxforge">ax jh eh n d ax</phoneme>
    <phoneme alphabet="ipa">Й™dК’Й›ndЙ™</phoneme>
  </lexeme>
  <lexeme> 
    <grapheme>agendas</grapheme>
    <phoneme alphabet="x-cmusphinx">AH JH EH N D AH Z</phoneme>
  </lexeme>
  <lexeme> 
    <grapheme>agent</grapheme>
    <phoneme alphabet="x-cmusphinx">EY JH AH N T</phoneme>
    <phoneme alphabet="x-htk-voxforge">ey jh ih n t</phoneme> 
    <phoneme alphabet="ipa">eЙЄdК’ЙЄnt</phoneme>
  </lexeme>
  <lexeme>
    <grapheme>agent's</grapheme>
    <phoneme alphabet="x-cmusphinx">EY JH AH N T S</phoneme>
  </lexeme>
...

К объединенному словарю PLS можно применить процедуры Extensible Stylesheet Language (XSL) или любые другие процедуры для получения необходимых результатов в виде неструктурированного файла или нового специального файла PLS. Теоритически в этом файле можно хранить и другие строки phoneme, даже для других языков. Однако это нестандартное использование спецификации PLS.

Кай Шотт проделал большую работу с PLS и предлагает для загрузки несколько готовых файлов для разных языков, в частности, немецкого (см. раздел Ресурсы).


Нерешенные проблемы

Хотя из неструктурированных файлов можно извлечь много информации, остаются нерешенными следующие проблемы.

Выбор из нескольких графем
Иногда слово имеет несколько вариантов написания на одном и том же языке. Для обоих вариантов роль и фонемы одинаковы, так что имеется несколько графем для одной лексемы. Однако PLS не позволяет добавить атрибут к элементу grapheme вроде атрибута alphabet элемента phoneme.
Акронимы
Словари часто содержат сокращения. В PLS для этого есть дочерний элемент lexeme, называемый <alias>. Чтобы построить PLS автоматически из неструктурированного файла, нужен способ отличать в словаре акронимы от реальных слов. В неструктурированных файлах этой информации может не быть.
Роль/часть речи
Как и в случае акронимов, информация о части речи из неструктурированных файлов недоступна для построения атрибутов role в PLS.

Заключение

Эта статья учит переводить неструктурированные файлы в формат PLS и наоборот. Хранение словарей в формате PLS имеет потенциальные преимущества. Проекты разработки ПО с открытым исходным кодом могут переводить свои файлы ресурсов в XML или нет. Это решение зависит от руководителей проектов — только они могут оценить ресурсы и применять их наилучшим способом, общедоступным в их сообществе.

Между тем читатель может использовать XML-стандарты в своей собственной работе без всяких потерь. Если хранить словари, используемые в работах по распознаванию речи, в формате PLS, то можно повысить степень адаптируемости, надежности и полезности смежных проектов. А при необходимости эти данные легко извлечь в неструктурированный файл нужного типа.

Ресурсы

Научиться

Получить продукты и технологии

  • VoxForge: о создании акустических моделей и другие сведения о построении модели распознавания речи.
  • CMU Sphinx: инструментарий для распознавания речи.
  • Python: подробные сведения о языке программирования, включая ссылки для загрузки.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Open source
ArticleID=877424
ArticleTitle=Переход к открытым стандартам при обработке речи
publish-date=08072012