Работа над функциональной частью редакторов разговорника завершена. Получились две страницы. Первая - редактор исходного корпуса. Здесь формируется структура разговорника и задаются контексты для исходных фраз. Вторая страница - редактор пользовательской части разговорника, переводчик. Здесь создаётся представление перевода фраз из исходного корпуса на все другие языки.
Теперь предстоит небыстрый процесс сборки вот этого исходного корпуса фраз, который затем должен быть переведён на наши языки. Очень хочется предоставить материал, который будет полезен обычным людям в реальных сценариях, и который будет извлекать максимальную пользу из технической базы интерактивности.
Пока непонятно, как именно собрать такой языковой материал. Будем думать.
Теперь предстоит небыстрый процесс сборки вот этого исходного корпуса фраз, который затем должен быть переведён на наши языки. Очень хочется предоставить материал, который будет полезен обычным людям в реальных сценариях, и который будет извлекать максимальную пользу из технической базы интерактивности.
Пока непонятно, как именно собрать такой языковой материал. Будем думать.
Да, это Черкесо-Осетино-Даргинский параллельный разговорник. Позволяет миновать английский или русский и играться с языками напрямую. Конечно, вряд ли кто-то будет одновременно просматривать вот такой набор языков, но как испытание для системы - картина впечатляющая. И хотя пока полностью переведена лишь одна фраза, можно уверенно говорить о корректной работе системы. И учитывая, что масштабирование здесь линейное, проблем не предвидится.
А ещё записал видео работы с редактором разговорника, где я добавляю дигорский перевод для этой фразы. Увы, там я неправильно перевёл дигорское местоимение (уже исправил на сайте), и произносил слова как попало, за что прошу осетин простить меня, но в качестве демонстрации процесса это сгодится.
А ещё записал видео работы с редактором разговорника, где я добавляю дигорский перевод для этой фразы. Увы, там я неправильно перевёл дигорское местоимение (уже исправил на сайте), и произносил слова как попало, за что прошу осетин простить меня, но в качестве демонстрации процесса это сгодится.
Потихоньку и другие языки начнут вливаться, если сайт окажется полезным для них.
Сагърай агъулар.
Сагърай агъулар.
Forwarded from ruxavus | агульский язык
Media is too big
VIEW IN TELEGRAM
Ас саламу алейкум.
На сайте https://avzag.app/#/ можно понаблюдать за изменением грамматики предложения в керенском диалекте агульского языка в сравнении с другими языками Кавказа. Сайт находится на стадии разработки и на данный момент внесена информация лишь по одной фразе, но к началу марта инша Аллагь начнется внесение информации по 100 базовым фразам.
На сайте https://avzag.app/#/ можно понаблюдать за изменением грамматики предложения в керенском диалекте агульского языка в сравнении с другими языками Кавказа. Сайт находится на стадии разработки и на данный момент внесена информация лишь по одной фразе, но к началу марта инша Аллагь начнется внесение информации по 100 базовым фразам.
Хотелось бы поделиться общими направлениями работы на ближайшее полугодие.
Самое главное сейчас - заполнение разговорника. Я вижу 4 этапа:
1. Составление списка статичных фраз - "спасибо тебе";
2. Выделение в каждой фразе переключаемых частей - "спасибо тебе / вам";
3. Добавление этой информации в систему через редактор корпуса;
4. Перевод этого корпуса через основной редактор на наши языки - осетинские, черкесские, лезгинские и т.д.
Параллельно нужно устранять накопившийся технический долг, в самом широком смысле. Это и рефакторинг кода, и исправление ошибок, и переход на новые инструменты. Для пользователя это будет незаметно, для дальнейших разработок - совершенно необходимо.
Особых сложностей с этими задачами не предвидится, нужно лишь плавно распределить работу, время у нас есть. А уже летом, Хуыцауы фандай, серьёзно возьмёмся за разработку словарей.
Самое главное сейчас - заполнение разговорника. Я вижу 4 этапа:
1. Составление списка статичных фраз - "спасибо тебе";
2. Выделение в каждой фразе переключаемых частей - "спасибо тебе / вам";
3. Добавление этой информации в систему через редактор корпуса;
4. Перевод этого корпуса через основной редактор на наши языки - осетинские, черкесские, лезгинские и т.д.
Параллельно нужно устранять накопившийся технический долг, в самом широком смысле. Это и рефакторинг кода, и исправление ошибок, и переход на новые инструменты. Для пользователя это будет незаметно, для дальнейших разработок - совершенно необходимо.
Особых сложностей с этими задачами не предвидится, нужно лишь плавно распределить работу, время у нас есть. А уже летом, Хуыцауы фандай, серьёзно возьмёмся за разработку словарей.
А тем временем, проекту почти год. То, что начиналось как простая игрушка для моего языка, потихоньку перерастает во что-то стоящее. Через неделю-две у нас будет что показать насчёт разговорника. А пока, вот график из нашего репозитория за последний год. Чем выше зелёная область, тем больше работы было сделано за этот период.
За последний месяц было 2 технических обновления. Они были сильно связаны друг с другом и шли с интервалом в 2 недели, поэтому я решил, что рассказать о них будет уместнее по окончании всей работы. Теперь, когда оба эти обновления на сайте, можно начать. Как и было необходимо, большая часть работы была под капотом (я очень доволен результатом), но есть и немало видимых для конечного пользователя улучшений.
Новое хранилище языковых данных
Весь языковой материал был перемещён в отдельную ветку репозитория. Такое разделение данных и логики позволяет тому, кто желает добавить именно языковой материал, не взаимодействовать с кодом вообще, что облегчает процесс. Что самое важное, теперь любые правки по языкам, будь то тексты или озвучка, появляются на сайте в течении пары минут, так как больше нет необходимости перекомпилировать весь проект.
Исправлена работа кэша
Раньше, в особенности после значительных изменений файловой структуры, нужно было вручную чистить кэш (или переустанавливать сайт как приложение), чтобы получить обновление. Теперь, при открытии домашней страницы (карта), кэш автоматически сбрасывается, что заставляет сайт загружать последние данные. При этом, когда вы открываете какие-либо языки, вся их текстовая информация в открытом модуле - алфавит, конвертер, разговорник (который будет готов в ближайшем будущем) - будет доступна и без интернета до тех пор, пока не будет открыта карта вместе с наличием сети.
Векторные карты
Полностью обновил работу с картой, перейдя на новую библиотеку. Теперь она загружается быстрее, масштабируется плавно, а изображение выглядит намного чётче благодаря векторной графике.
Удобства для редакторов
Мне хотелось бы несколько сбавить техническую работу в последующие месяцы, и больше сосредоточиться на заполнении языков. Во-первых, это то, что видно, а во-вторых, сайт теперь стоит на крепком фундаменте. Поэтому я провёл большую работу по доработке редакторов, так что теперь их интерфейс более аккуратный и функциональный.
- Объединил навигацию всех редакторов в одну компактную панель с 4мя глобальными действиями: загрузить из репозитория, скопировать JSON, вставить JSON, сбросить.
- Добавил возможность клонировать и смещать элементы в местах работы с массивами (преобразования конвертера, секции разговорника, и т.д.)
- Добавил небольшое текстовое поле в редактор конвертера, где можно моментально тестировать переходы.
- Объединил requirements с conditions в редакторе блоков разговорника. Об этом подробнее в следующем посте.
- Добавил кнопку для копирования ID фразы в редакторе разговорника. Об этом тоже подробнее в следующем посте.
Разное
- Добавил отображение флагов выбранных языков на каждый модуль, потому что так красиво.
- Добавил кнопку "копировать" для примеров к фонемам (копирует слово и IPA через пробел).
- Теперь при глоссировании фраз, если у блока не занесены ни IPA, ни, собственно, глоссы, будет отображён стандартный текст.
- Подсказки для контекста во фразах больше не отображают названия сущностей. В этом не было нужды.
- Добавлена шкала проигрывания для аудиофайлов фонем и фраз.
Новое хранилище языковых данных
Весь языковой материал был перемещён в отдельную ветку репозитория. Такое разделение данных и логики позволяет тому, кто желает добавить именно языковой материал, не взаимодействовать с кодом вообще, что облегчает процесс. Что самое важное, теперь любые правки по языкам, будь то тексты или озвучка, появляются на сайте в течении пары минут, так как больше нет необходимости перекомпилировать весь проект.
Исправлена работа кэша
Раньше, в особенности после значительных изменений файловой структуры, нужно было вручную чистить кэш (или переустанавливать сайт как приложение), чтобы получить обновление. Теперь, при открытии домашней страницы (карта), кэш автоматически сбрасывается, что заставляет сайт загружать последние данные. При этом, когда вы открываете какие-либо языки, вся их текстовая информация в открытом модуле - алфавит, конвертер, разговорник (который будет готов в ближайшем будущем) - будет доступна и без интернета до тех пор, пока не будет открыта карта вместе с наличием сети.
Векторные карты
Полностью обновил работу с картой, перейдя на новую библиотеку. Теперь она загружается быстрее, масштабируется плавно, а изображение выглядит намного чётче благодаря векторной графике.
Удобства для редакторов
Мне хотелось бы несколько сбавить техническую работу в последующие месяцы, и больше сосредоточиться на заполнении языков. Во-первых, это то, что видно, а во-вторых, сайт теперь стоит на крепком фундаменте. Поэтому я провёл большую работу по доработке редакторов, так что теперь их интерфейс более аккуратный и функциональный.
- Объединил навигацию всех редакторов в одну компактную панель с 4мя глобальными действиями: загрузить из репозитория, скопировать JSON, вставить JSON, сбросить.
- Добавил возможность клонировать и смещать элементы в местах работы с массивами (преобразования конвертера, секции разговорника, и т.д.)
- Добавил небольшое текстовое поле в редактор конвертера, где можно моментально тестировать переходы.
- Объединил requirements с conditions в редакторе блоков разговорника. Об этом подробнее в следующем посте.
- Добавил кнопку для копирования ID фразы в редакторе разговорника. Об этом тоже подробнее в следующем посте.
Разное
- Добавил отображение флагов выбранных языков на каждый модуль, потому что так красиво.
- Добавил кнопку "копировать" для примеров к фонемам (копирует слово и IPA через пробел).
- Теперь при глоссировании фраз, если у блока не занесены ни IPA, ни, собственно, глоссы, будет отображён стандартный текст.
- Подсказки для контекста во фразах больше не отображают названия сущностей. В этом не было нужды.
- Добавлена шкала проигрывания для аудиофайлов фонем и фраз.
GitHub
GitHub - alkaitagi/avzag at store
Languages, sounds, and scripts. Contribute to alkaitagi/avzag development by creating an account on GitHub.
This media is not supported in your browser
VIEW IN TELEGRAM
В следующем посте я постараюсь рассказать о главном улучшении - возможности добавлять озвучку в разговорник, а так же о некотором упрощении логики работы контекста разговорника. А пока, вот небольшая демонстрация.
После ещё некоторого успешного тестирования и оптимизаций, уверенно считаю, что работать с разговорником стало легче, а принципы его работы - более просты. Продолжаем разбор новых функций.
Упрощённая структура блоков
Напомню, что каждая фраза в разговорнике состоит из блоков, каждый из которых является машиной конечных состояний. Эти блоки изменяют глобальный контекст и реагируют на его изменения. Этот контекст является общим для фраз на всех отображаемых языках. Раньше у каждого блока было поле требований, которые, если не удовлетворены, полностью скрывали блок. Ещё у каждого состояния в блоке был свой набор условий, каждое из которых могло вдобавок быть пассивным. Эта система работала, но мне всё не давала покоя её ненужная сложность, и я сильно желал её упростить.
Теперь же функции требований для отключения блока объединены с условиями состояний. Каждый тег в условии состояния может быть в одном из 3х состояний: игнорирован, запрошен, либо предоставлен. Запрошенный тег, если отсутствует в контексте, скрывает данное состояние. Предоставляемый тег, при показе состояния, посылается в глобальный контекст. При изменении соответствующих свойств контекста каждый блок составляет рейтинг из своих состояний на основе их предоставляемых тегов, и показывает первое из них, либо никакое, если ни одно состояние не нашло все запрашиваемые теги. Абстрактно это может звучать несколько сложно, но на примере должно стать понятно.
Простая фраза с двумя блоками: "ду вянда (я иду)" . Первый блок - я - может быть в одном из двух состояний: "ду (ед.)" и "нисса (мн.)". Первое состояние предоставляет в контекст информацию о том, что лицо в единственном числе, а второе - что во множественном. Далее, второй блок - иду - может быть в одном из трёх состояний: "вянда (муж.)", "рянда (жен.)", "дянда (мн.)". Первое состояние, прежде всего, требует, чтобы человек в контексте был в единственном числе, и предоставляет информацию о том, что он - мужчина. Второе состояние выдвигает то же требование, и предоставляет то, что человек - женщина. А третье состояние не предоставляет ничего, лишь требуя, чтобы лицо было во множественном числе, так как эта информация уже предоставлена во втором состоянии первого блока. Изменение отображаемого состояния в любом блоке с предоставляемыми тегами посылает цепную реакцию через контекст во все другие блоки во всех языках. Вот как-то так.
Упрощённая структура блоков
Напомню, что каждая фраза в разговорнике состоит из блоков, каждый из которых является машиной конечных состояний. Эти блоки изменяют глобальный контекст и реагируют на его изменения. Этот контекст является общим для фраз на всех отображаемых языках. Раньше у каждого блока было поле требований, которые, если не удовлетворены, полностью скрывали блок. Ещё у каждого состояния в блоке был свой набор условий, каждое из которых могло вдобавок быть пассивным. Эта система работала, но мне всё не давала покоя её ненужная сложность, и я сильно желал её упростить.
Теперь же функции требований для отключения блока объединены с условиями состояний. Каждый тег в условии состояния может быть в одном из 3х состояний: игнорирован, запрошен, либо предоставлен. Запрошенный тег, если отсутствует в контексте, скрывает данное состояние. Предоставляемый тег, при показе состояния, посылается в глобальный контекст. При изменении соответствующих свойств контекста каждый блок составляет рейтинг из своих состояний на основе их предоставляемых тегов, и показывает первое из них, либо никакое, если ни одно состояние не нашло все запрашиваемые теги. Абстрактно это может звучать несколько сложно, но на примере должно стать понятно.
Простая фраза с двумя блоками: "ду вянда (я иду)" . Первый блок - я - может быть в одном из двух состояний: "ду (ед.)" и "нисса (мн.)". Первое состояние предоставляет в контекст информацию о том, что лицо в единственном числе, а второе - что во множественном. Далее, второй блок - иду - может быть в одном из трёх состояний: "вянда (муж.)", "рянда (жен.)", "дянда (мн.)". Первое состояние, прежде всего, требует, чтобы человек в контексте был в единственном числе, и предоставляет информацию о том, что он - мужчина. Второе состояние выдвигает то же требование, и предоставляет то, что человек - женщина. А третье состояние не предоставляет ничего, лишь требуя, чтобы лицо было во множественном числе, так как эта информация уже предоставлена во втором состоянии первого блока. Изменение отображаемого состояния в любом блоке с предоставляемыми тегами посылает цепную реакцию через контекст во все другие блоки во всех языках. Вот как-то так.
Raxys Studios
После ещё некоторого успешного тестирования и оптимизаций, уверенно считаю, что работать с разговорником стало легче, а принципы его работы - более просты. Продолжаем разбор новых функций. Упрощённая структура блоков Напомню, что каждая фраза в разговорнике…
Для полноты описания стоит ещё дать краткое объяснение переходам между состояниями в блоке. Во всё той же фразе, первый блок свободно переключается между "ду (ед.)" и "нисса (мн.)", изменяя множественность лица. Во втором же блоке, "дянда (мн.)" не имеет перехода, так как вся его информация уже задаётся через "нисса". А вот "вянда (муж.)" и "рянда (жен.)" так же могут свободно переключаться между собой, дополняя единственное число лица ещё и его родом.
Raxys Studios
В следующем посте я постараюсь рассказать о главном улучшении - возможности добавлять озвучку в разговорник, а так же о некотором упрощении логики работы контекста разговорника. А пока, вот небольшая демонстрация.
Последние посты по большей части рассказывали о доработке интерфейса редакторов и об общих улучшениях сайта. А теперь про ключевое пользовательское обновление.
Звуковое сопровождение разговорника
Главная сложность озвучки нашего разговорника в том, что звук должен меняться вместе с изменением отображаемого текста. Рассмотрим предложение из четырёх слов, в котором изменяются первое и последнее: "[ Мне ] нужно увидеть [ врача ]".
Предположим, длительность произношения каждого слова - 1 сек., тогда всё предложение (не важно в какой вариации) - 4 сек. Допустим, мы не разбиваем аудиофайл предложения на слова, а записываем и проигрываем всё целиком. В первом блоке у нас четыре вариации: "мне, тебе, ему,адыгэ уей уей", а во втором - три: "врача, юриста, полицейского". 4 * 3 = 12 вариаций конечного предложения. Если, как уже было сказано, каждая вариация занимает 4 сек., то всё это займёт 4 * 12 = 48 сек. записи.
А теперь представим, что мы записываем не всё предложение целиком, а именно каждый блок по отдельности. Первый блок - 4 вариации - 4 сек. Второй блок - статичный текст "нужно увидеть" - 2 сек. Третий блок - 3 вариации - 3 сек. Итого: 4 + 2 + 3 = 9 сек.
9 сек. с разбивкой против 48 сек. без разбивки. И это лишь одно, вероятно, не самое сложное предложение. И таких у нас будут многие десятки. Каждое из них записывать в полных вариациях - огромный объем рутинной работы, которая будет лишь увеличиваться, и которую можно избежать.
Работает это достаточно просто. По нажатию кнопки система собирает тексты всех отображаемых блоков во фразе, и проигрывает друг за другом файлы с соответствующими именами. Так, если фраза находится в состоянии "[ Мне ] нужно увидеть [ врача ]", то система ищет файлы "Мне.mp3", "нужно увидеть.mp3", "врача.mp3", и проигрывает их, пропуская отсутствующие файлы. При изменении какого-либо блока изменяется и название запрашиваемого файла. Эти файлы хранятся в папках
На этом я успешно завершаю основополагающую техническую работу на ближайшее время. Теперь, наконец, плотно приступаем к составлению разговорника. Об этом расскажем на следующей неделе.
Звуковое сопровождение разговорника
Главная сложность озвучки нашего разговорника в том, что звук должен меняться вместе с изменением отображаемого текста. Рассмотрим предложение из четырёх слов, в котором изменяются первое и последнее: "[ Мне ] нужно увидеть [ врача ]".
Предположим, длительность произношения каждого слова - 1 сек., тогда всё предложение (не важно в какой вариации) - 4 сек. Допустим, мы не разбиваем аудиофайл предложения на слова, а записываем и проигрываем всё целиком. В первом блоке у нас четыре вариации: "мне, тебе, ему,
А теперь представим, что мы записываем не всё предложение целиком, а именно каждый блок по отдельности. Первый блок - 4 вариации - 4 сек. Второй блок - статичный текст "нужно увидеть" - 2 сек. Третий блок - 3 вариации - 3 сек. Итого: 4 + 2 + 3 = 9 сек.
9 сек. с разбивкой против 48 сек. без разбивки. И это лишь одно, вероятно, не самое сложное предложение. И таких у нас будут многие десятки. Каждое из них записывать в полных вариациях - огромный объем рутинной работы, которая будет лишь увеличиваться, и которую можно избежать.
Работает это достаточно просто. По нажатию кнопки система собирает тексты всех отображаемых блоков во фразе, и проигрывает друг за другом файлы с соответствующими именами. Так, если фраза находится в состоянии "[ Мне ] нужно увидеть [ врача ]", то система ищет файлы "Мне.mp3", "нужно увидеть.mp3", "врача.mp3", и проигрывает их, пропуская отсутствующие файлы. При изменении какого-либо блока изменяется и название запрашиваемого файла. Эти файлы хранятся в папках
{lect}/audio/phrasebook/{phrase.id}, а prhase.id можно скопировать в редакторе разговорника. Таким образом, озвучка буквально собирается на ходу под текущий вариант фразы.На этом я успешно завершаю основополагающую техническую работу на ближайшее время. Теперь, наконец, плотно приступаем к составлению разговорника. Об этом расскажем на следующей неделе.
За последний месяц я пытался по-разному подходить к составлению разговорника, и понял две вещи:
1. Решения о том, какие фразы включать и как их организовывать, не должен принимать один человек, особенно такой некомпетентный как я.
2. Составление должно быть итеративным процессом, поскольку объём работы слишком велик, а ресурсы слишком малы, чтобы взять и разом всё сделать.
Поэтому работа по корпусу теперь проводится в обновляемом документе, и весь языковой материал, напоминаю, хранится на ветке репозитория. Все желающие могут комментировать и предлагать дополнения к корпусу, а также добавлять перевод для своего языка на сайт через инструменты редактирования. Такой получается Crowd & Open Source.
Я планирую придерживаться такого плана: одна неделя - составление нового раздела корпуса и его переводов, следующая - добавление голоса и текста на сайт. И так по кругу в течение пары месяцев. Думаю, это оптимальный режим для последовательной работы, который позволит мне не перегорать, и в то же время даст достаточно времени для обсуждений. По необходимости будем корректировать план.
Несколько спонтанная первая итерация завершается сегодня. Я её форсировал, так как хотел иметь какой-то базовый результат. По итогам у нас имеется первая секция "Greeting & Parting" с 9ю простыми фразами, переведёнными на кайтагский (текст & голос), иронский (текст & голос) и керенский (текст) (благодарю Таймураза из @ironau_online и Абдурахима из @ruxavus за их помощь). На следующей неделе займусь составлением следующего раздела. Надеюсь, удастся придерживаться темпа.
1. Решения о том, какие фразы включать и как их организовывать, не должен принимать один человек, особенно такой некомпетентный как я.
2. Составление должно быть итеративным процессом, поскольку объём работы слишком велик, а ресурсы слишком малы, чтобы взять и разом всё сделать.
Поэтому работа по корпусу теперь проводится в обновляемом документе, и весь языковой материал, напоминаю, хранится на ветке репозитория. Все желающие могут комментировать и предлагать дополнения к корпусу, а также добавлять перевод для своего языка на сайт через инструменты редактирования. Такой получается Crowd & Open Source.
Я планирую придерживаться такого плана: одна неделя - составление нового раздела корпуса и его переводов, следующая - добавление голоса и текста на сайт. И так по кругу в течение пары месяцев. Думаю, это оптимальный режим для последовательной работы, который позволит мне не перегорать, и в то же время даст достаточно времени для обсуждений. По необходимости будем корректировать план.
Несколько спонтанная первая итерация завершается сегодня. Я её форсировал, так как хотел иметь какой-то базовый результат. По итогам у нас имеется первая секция "Greeting & Parting" с 9ю простыми фразами, переведёнными на кайтагский (текст & голос), иронский (текст & голос) и керенский (текст) (благодарю Таймураза из @ironau_online и Абдурахима из @ruxavus за их помощь). На следующей неделе займусь составлением следующего раздела. Надеюсь, удастся придерживаться темпа.