Англо-русская практическая транскрипция на Python
Необходим способ транслитерировать с учетом произношения английские (записанные латиницей) имена и названия на русский.
Интересует именно практическая транскрипция а не просто транслитерация. По ссылке есть огромная таблица с правилами, но я даже примерно не представляю себе, как все их закодить, и там ещё во многих местах не уточняется, какой из вариантов слога использовать в каких случаях. Возможно нужен большой словарь под капотом.
Есть встроенная библиотека transliterate
, и соответствующая функция translit("Old White End", "ru")
но она совершенно бесполезна, так как возвращает Олд Wхите Енд
а хочется увидеть Олд Уайт Энд
. Или Дэвис Корт
, а не Давис Цоурт
.
Есть ли какие-нибудь готовые или полуготовые решения по этому поводу?
Ответы (2 шт):
Можно задать таблицу соответствий между символами ИПА и русскими буквами. Вот пример (дисклеймер - таблицу соответствий сделал сам, за точность передачи не ручаюсь, кому не нравится - уточняйте и расширяйте)
"""
Этот скрипт демонстрирует, как преобразовать английский текст в транскрипцию IPA,
а затем к русскоязычному фонетическому представлению.
"""
import eng_to_ipa as ipa
# ipa2ru_map - Словарь для преобразования символов IPA в русскоязычные фонемы
ipa2ru_map = {
"p": "п", "b": "б", "t": "т", "d": "д", "k": "к", "g": "г", "m": "м", "n": "н", "ŋ": "нг", "ʧ": "ч", "ʤ": "дж", "f": "ф", "v": "в", "θ": "т", "ð": "з", "s": "с", "z": "з", "ʃ": "ш", "ʒ": "ж", "h": "х", "w": "в", "j": "й", "r": "р", "l": "л",
# гласные
"i": "и", "ɪ": "и", "e": "э", "ɛ": "э", "æ": "э", "ʌ": "а", "ə": "е", "u": "у", "ʊ": "у", "oʊ": "оу", "ɔ": "о", "ɑ": "а", "aɪ": "ай", "aʊ": "ау", "ɔɪ": "ой", "ɛr": "ё", "ər": "ё", "ɚ": "а", "ju": "ю", "əv": "ов",
# ударения
"ˈ": "", "ˌ": "",
}
def ipa2ru_at_pos(ipa_text: str, pos: int) -> tuple[str, int]:
"""
Переводит символ или пару символов из строки IPA в соответствующий русский символ(ы) в данной позиции.
Аргументы:
ipa_text (str): Входная строка, содержащая символы IPA.
pos (int): Положнение в строке.
Возвращаемое значение:
tuple[str, int]: Кортеж, содержащий русскую озвучку и новую позицию после перевода.
Если символ(ы) в данной позиции не найден(ы) в таблице соответствий,
то возвращается строка, в которой неизвестные символ(ы) обрамлены восклицательными знаками.
Второй элемент кортежа содержит позицию следующего необработанного символа.
"""
ch = ipa_text[pos]
ch2 = ipa_text[pos : pos + 2]
# дифтонги или сочетания фонем
if ch2 in ipa2ru_map:
return ipa2ru_map[ch2], pos + 2
# одиночные фонемы
if ch in ipa2ru_map:
return ipa2ru_map[ch], pos + 1
# ascii символы - цифры, пунктуация и т.д.
if ord(ch) < 128:
return ch, pos + 1
return f"!{ch}!", pos + 1
def ipa2ru(ipa_text: str) -> str:
"""
Преобразует транскрипцую, заданную символами IPA (международный фонетический алфавит),
в русское фонетическое представление.
Args:
ipa_text (str): Входная строка, содержащая символы IPA.
Returns:
str: Полученная строка с русским фонетическим представлением.
"""
result = ""
pos = 0
while pos < len(ipa_text):
ru_ch, pos = ipa2ru_at_pos(ipa_text, pos)
result += ru_ch
return result
Пример перевода фразы, содержащей все звуки английского языка
# Фраза, содержащая все (наверное) звуки английского языка
eng = (
"The beige hue on the waters of the loch impressed all,"
" including the French queen, before she heard that symphony again,"
" just as what young Arthur wanted."
)
transcription = ipa.convert(eng)
print(eng)
print(transcription)
print(ipa2ru(transcription))
Получилось вот что
The beige hue on the waters of the loch impressed all, including the French queen, before she heard that symphony again, just as what young Arthur wanted.
ðə beɪʒ hju ɔn ðə ˈwɔtərz əv ðə lɑk ˌɪmˈprɛst ɔl, ˌɪnˈkludɪŋ ðə frɛnʧ kwin, ˌbiˈfɔr ʃi hərd ðət ˈsɪmfəni əˈgɛn, ʤɪst ɛz wət jəŋ ˈɑrθər ˈwɔntɪd.
зе бэиж хю он зе вотёз ов зе лак импрэст ол, инклудинг зе фрэнч квин, бифор ши хёд зет симфени егэн, джист эз вет йенг артё вонтид.
Кстати, end_to_ipa привирает. Например, он передал loch
как lɑk
,хотя следовало читать как lɒx
ЗЫ. Документацию сгенерировал Copilot. Никогда ранее мой код не был так хорошо документирован )))
Алгоритмом не прокатит почти наверняка. Только через полный словарь, но ещё надо будет в некоторых случаях из контекста понимать время или смысл. Возможно ещё часть речи, но это в основном на ударение влияет, а ты вроде не просил.