Обсуждение модуля:Ru-pron
Надо что-то менятьПравить
Is there a demonstration incorrect diction or the correct pronunciation?
Tath’s not correct IPA: a sound of the pronunciation of a letter 'D' is similar to the sound of a letter 'T' only in the absence of diction.
- код [kot] but mast be [ko(d)] — the sound of 'D' are not resonant, but that is different of sound 'T' [ˈkodɨ] — кот [kot]
- род [rot] but mast be [ro(d)] — the sound of 'D' are not resonant, but that is different of sound 'T' — рот [rot]
- фонд [font] but mast be [fon(d)] — the sound of 'D' are not resonant, but that is different of sound 'T' — фонт[font]
- Солнце [ˈsont͡sə] but mast be [so(l)nt͡sə] = nasal pronunciation of «(l)n»
- костный [ˈkosnɨj] but mast be [ˈkos(t)nɨj] = nasal pronunciation of «(t)n»
- сносный [ˈsnosnɨj]
- безвластный [bʲɪzˈvlasnɨj] but mast be [bʲɪzvˈlas(t)nɨj] = nasal pronunciation of «(t)n»
- баластный [bɐˈlasnɨj] but mast be [bɐˈlas(t)nɨj] = nasal pronunciation of «(t)n»
- Мы демонстрируем неверную дикцию или правильное произношение слов?
Это ошибочный IPA: звук произношения букв Д и Т одинаков только у неимущих дикции.
- код [kot], но должно быть [ko(d)] — звук Д глухой, но сильно отличен от звука Т [ˈkodɨ] — кот [kot]
- род [rot], но должно быть [ro(d)] — звук Д глухой, но сильно отличен от звука Т — рот [rot]
- фонд [font], но должно быть [fon(d)] — звук Д глухой, но сильно отличен от звука Т — фонт[font]
- Солнце [ˈsont͡sə], но должно быть [so(l)nt͡sə] = носовое произношение «(l)n»
- костный [ˈkosnɨj], но должно быть [ˈkos(t)nɨj] = носовое произношение «(t)n»
- сносный [ˈsnosnɨj]
- безвластный [bʲɪzˈvlasnɨj], но должно быть [bʲɪzvˈlas(t)nɨj] = носовое произношение «(t)n»
- баластный [bɐˈlasnɨj], но должно быть [bɐˈlas(t)nɨj] = носовое произношение «(t)n»
- Копия для истории (с дальнейшим переводом)
- Who are you? What is you native language? I don’t know what nasal «n» you are talking about. The recorded file for «род» sounds Ukrainian. In Russian «род» and «рот» sound identically — /rot/, the recording is voiced unnecessarily, it sounds /rod/, not /rot/, which is wrong. Voiced consonants are completely devoiced in the final position. Your notation doesn’t make sense to me but the automatically generated IPA are correct. I’m native Russian. If you wish, you can go to the Russian Wiktionary instead. --Anatoli T. (обсудить/вклад) 12:56, 17 March 2015 (UTC)
- Это как бы в таком стиле по-русски будет
- Кто ты такой (бляха муха)? Какой твой родной язык? Я не знаю что такое носовой звук «Н», о котором ты говоришь. Записанный файл для «род» — украинский звук. В русском языке «род» и «рот» звучат одинаково — [рот], в записи здесь излишнее звучание (неправильное как бы, по мнению автора комментария — не по-русски, как он указал ранее): звук /род/, а не /рот/, это — ошибка. (Все) звонкие согласные полностью «оглушаются» в окончаниях. Твои претензии не имеют для меня смысла, и автоматическое генерирование шаблона IPA являются правильными. Я родом из России. Если желаешь, иди в русский словарь — вместо этого. Анатолий…
- Ответ
- Are you Russian?! What kind of language at that record — Ukrainian?! What kind of school you visited? The recorded show Russian sound and Russian words! Who hasn’t ear for music — not to hear words also. Who have no diction — said is not correct too. That 'D' isn’t 'T'. The pronunciation is completely different.
- Перевод ответа
- Ты русский?! Какой язык на той записи — украинский?! Ты какую школу посещал? Запись демонстрирует русский звук и русские слова! Кто не имеет музыкального слуха, — не слышит и слов. Кто не имеет дикции, и говорит неверно. Та Д, не Т. Произношение совершенного различно.
- The recording is incorrect, the IPA is correct. Please go to Russian phonology. I don't have time for these discussions. --Anatoli T. (обсудить/вклад) 20:23, 17 March 2015 (UTC)
- Перевод
- Запись неверная, а IPA правильное. Пожалуйста зайди ... Я не имею времени на дискуссии.
- Это русская запись русских слов, записанная самими русскими - "неверна"?!!! Да, уж... Нет слов! Не дискутируй - никто ж не заставляет. Только произношение генерируется неверно. Так говорят только те, кто не имеет дикции и кому медведь на ухо наступил. А в слове "Солнце" произносится "Л" почти одновременно с носовым звуком "Н". И звук "Д", хотя и глуше, но отличен от звука "Т" и очень даже сильно. Кроме того, есть как минимум 2-е фонологические школы: Питерская и Московская... Но это минимум. Двойные согласные тоже имеют место в виде долготы одинарного звука, а не так как показывает этот генератор. В нижеперечисленых словах произностится "-тНый":
[ˈpodːən(ː)ɨj], [ɐˈrʲesnɨj], [bɐˈlasnɨj], [bʲɪzɐˈkazʲɪsnɨj], [bʲɪˈzvʲesnɨj], [bʲɪzˈvlasnɨj], [bʲɪˈzvozrəsnɨj], [bʲɪzˈɡordəsnɨj], [bʲɪzˈɡrubəsnɨj], [bʲɪˈʐːaləsnɨj], [bʲɪz⁽ʲ⁾ˈlʲenəsnɨj], [bʲɪz⁽ʲ⁾ˈlʲepʲɪsnɨj], [bʲɪz⁽ʲ⁾ˈlʲesnɨj], [bʲɪz⁽ʲ⁾ˈlʲisnɨj], [bʲɪzˈlopəsnɨj]...
- Обратись в русский викисловарь или в Википедию, где описали русскую фонетику. Они (в русском викисловаре) используют ту же систему, но иногда с небольшими расхождениями (иногда более подробно описывают звуки — например у нас стол /stol/, а в рувики [stoɫ]). Многие слова имеют фонетическую транскрипцию. Для дискуссий советую все-таки использовать символы МФА, а не описания типа «глуше», «носовой н», «resonant» и т. д. Для каждого звука есть стандартный символ в МФА. По поводу «Не дискутируй — никто ж не заставляет» — я здесь самый активный русский участник, в русском викисловаре намного больше людей, которые помогут тебе ответит на твои вопросы. На этом я заканчиваю, а дискуссию удалю, как ненужную. Всех благ. --Anatoli T. (обсудить/вклад) 23:41, 17 March 2015 (UTC)
- Анатолий! Дорогой! Это не русский алфавит (пусть даже фонетический), а МЕЖДУНАРОДНЫЙ. А в МФА как раз есть различия в начертании различных вариантов произношения глухих букв, рассматриваемых здесь: и взрывных, и носальных (носовых), и альвеольных… Но! Звук «Д» не становится «Т». Он просто звучит несколько иначе, так как проходит по иным словообразующим путям речевого аппарата. Кстати, русская фонетика — в русском стиле и в русской словесности, описывается кириллицей. Тут же указавается о «Международном фонетическом алфавите». Алфавите! А не слове и не кириллических символах. Вот именно, что — … для каждого звука(!) есть стандартный(!) символ в МФА… Что я и пытаюсь донести. Это раздел обсуждения конкретной темы, а не флуд и не базар на вольные темы. Да и тема не для одного или двух участников (как я и ты), а для всех — кто может оказать содействие в уточнении или исправлении неточностей. Newyorker (обсуждение) 12:48, 18 марта 2015 (UTC)
- Конечно же, «истеричный, — родом из России», удалил сообщения
- мозгов-то не хватает понять суть вопроса и исправить ошибки, — согласно им же рекомендованного МФА с таблицами и описанием. Прям как по сталинской идеологии: нет человека — нет проблем.
Исправлен баг: надо перенести в Модуль.Править
local ut = require("Module:utils")
local com = require("Module:ru-common")
local m_ru_translit = require("Module:ru-translit")
local strutils = require("Module:string utilities")
local export = {}
local u = mw.ustring.char
local rfind = mw.ustring.find
local rsubn = mw.ustring.gsub
local rmatch = mw.ustring.match
local rsplit = mw.text.split
local ulower = mw.ustring.lower
local uupper = mw.ustring.upper
local usub = mw.ustring.sub
local ulen = mw.ustring.len
-- version of rsubn() that discards all but the first return value
local function rsub(term, foo, bar)
local retval = rsubn(term, foo, bar)
return retval
end
-- apply rsub() repeatedly until no change
local function rsub_repeatedly(term, foo, bar)
while true do
local new_term = rsub(term, foo, bar)
if new_term == term then
return term
end
term = new_term
end
end
-- If enabled, compare this module with new version of module to make
-- sure all pronunciations are the same. Eventually consider removing this;
-- but useful as new code is created.
local test_new_ru_pron_module = false
-- If enabled, do new code for final -е; else, the old way
local new_final_e_code = false
local AC = u(0x0301) -- acute = ́
local GR = u(0x0300) -- grave = ̀
local CFLEX = u(0x0302) -- circumflex = ̂
local DUBGR = u(0x030F) -- double grave = ̏
local DOTABOVE = u(0x0307) -- dot above = ̇
local DOTBELOW = u(0x0323) -- dot below = ̣
local vow = 'aeiouyɛəäạëöü'
local ipa_vow = vow .. 'ɐɪʊɨæɵʉ'
local vowels, vowels_c = '[' .. vow .. ']', '([' .. vow .. '])'
-- No need to include DUBGR here because we rewrite it to CFLEX very early
local acc = AC .. GR .. CFLEX .. DOTABOVE .. DOTBELOW
local accents = '[' .. acc .. ']'
local perm_syl_onset = ut.list_to_set({
'bd', 'bz', 'bl', 'br', 'vd', 'vz', 'vzv', 'vl', 'vm', 'vr', 'gl', 'gn', 'gr', 'dž', 'dn', 'dv', 'dl', 'dr', 'žd', 'zb', 'zd', 'zm', 'zn', 'zv', 'zr', 'kl', 'kr', 'kt', 'ml', 'mn', 'nr', 'pl', 'pr', 'ps', 'pt', 'pš', 'stv', 'str', 'sp', 'st', 'sk', 'skl', 'skr', 'sl', 'sf', 'sx', 'sc', 'sm', 'sn', 'sv','sʺ', 'sʹj', 'spr', 'sr', 'tk', 'tv', 'tl', 'tr', 'fk', 'fl', 'fr', 'fs', 'ft', 'fš', 'xl', 'xm', 'xr', 'šk', 'šl', 'št', 'šč',
})
-- FIXME: Consider changing ӂ internally to ʑ to match ɕ (it is used externally
-- in e.g. дроӂӂи (pronunciation spelling of дрожжи)
local translit_conv = {
['c'] = 't͡s', ['č'] = 't͡ɕ', ['ĉ'] = 't͡ʂ',
['g'] = 'ɡ', ['ĝ'] = 'd͡ʐ',
['ĵ'] = 'd͡z', ['ǰ'] = 'd͡ʑ', ['ӂ'] = 'ʑ',
['š'] = 'ʂ', ['ž'] = 'ʐ'
}
local translit_conv_j = {
['cʲ'] = 'tʲ͡sʲ',
['ĵʲ'] = 'dʲ͡zʲ'
}
local allophones = {
['a'] = { 'a', 'ɐ', 'ə' },
['e'] = { 'e', 'ɪ', 'ɪ' },
['i'] = { 'i', 'ɪ', 'ɪ' },
['o'] = { 'o', 'ɐ', 'ə' },
['u'] = { 'u', 'ʊ', 'ʊ' },
['y'] = { 'ɨ', 'ɨ', 'ɨ' },
['ɛ'] = { 'ɛ', 'ɛ', 'ɛ' },
['ä'] = { 'a', 'ɪ', 'ɪ' },
['ạ'] = { 'a', 'ɐ', 'ə' },
['ë'] = { 'e', 'ɪ', 'ɪ' },
['ö'] = { 'ɵ', 'ɪ', 'ɪ' },
['ü'] = { 'u', 'ʊ', 'ʊ' },
['ə'] = { 'ə', 'ə', 'ə' },
}
local devoicing = {
['b'] = 'p', ['d'] = 't', ['g'] = 'k',
['z'] = 's', ['v'] = 'f',
['ž'] = 'š', ['ɣ'] = 'x',
['ĵ'] = 'c', ['ǰ'] = 'č', ['ĝ'] = 'ĉ',
['ӂ'] = 'ɕ',
}
local voicing = {
['p'] = 'b', ['t'] = 'd', ['k'] = 'g',
['s'] = 'z', ['f'] = 'v',
['š'] = 'ž', ['c'] = 'ĵ', ['č'] = 'ǰ', ['ĉ'] = 'ĝ',
['x'] = 'ɣ', ['ɕ'] = 'ӂ'
}
local iotating = {
['a'] = 'ä',
['e'] = 'ë',
['o'] = 'ö',
['u'] = 'ü'
}
local retracting = {
['e'] = 'ɛ',
['i'] = 'y',
}
local fronting = {
['a'] = 'æ',
['u'] = 'ʉ',
['ʊ'] = 'ʉ',
}
-- Prefixes that we recognize specially when they end in a geminated
-- consonant. The first element is the result after applying voicing/devoicing,
-- gemination and other changes. The second element is the original spelling,
-- so that we don't overmatch and get cases like Поттер. We check for these
-- prefixes at the beginning of words and also preceded by ne-, po- and nepo-.
local geminate_pref = {
--'abː', --'adː',
{'be[szšž]ː', 'be[sz]'},
--'braomː',
{'[vf]ː', 'v'},
{'vo[szšž]ː', 'vo[sz]'},
{'i[szšž]ː', 'i[sz]'},
--'^inː',
{'kontrː', 'kontr'},
{'superː', 'super'},
{'tran[szšž]ː', 'trans'},
{'na[tdcč]ː', 'nad'},
{'ni[szšž]ː', 'ni[sz]'},
{'o[tdcč]ː', 'ot'}, --'^omː',
{'o[bp]ː', 'ob'},
{'obe[szšž]ː', 'obe[sz]'},
{'po[tdcč]ː', 'pod'},
{'pre[tdcč]ː', 'pred'}, --'^paszː', '^pozː',
{'ra[szšž]ː', 'ra[sz]'},
{'[szšž]ː', '[szšž]'}, -- ž on right for жжёт etc., ш on left for США
{'me[žš]ː', 'mež'},
{'če?re[szšž]ː', 'če?re[sz]'},
-- certain double prefixes involving ra[zs]-
{'predra[szšž]ː', 'predra[sz]'},
{'bezra[szšž]ː', 'bezra[sz]'},
{'nara[szšž]ː', 'nara[sz]'},
{'vra[szšž]ː', 'vra[sz]'},
{'dora[szšž]ː', 'dora[sz]'},
-- '^sverxː', '^subː', '^tröxː', '^četyröxː',
}
local sztab = { s='cs', z='ĵz' }
local function ot_pod_sz(pre, sz)
return pre .. sztab[sz]
end
local phon_respellings = {
{'h', 'ɣ'},
{'šč', 'ɕː'}, -- conversion of šč to geminate
-- the following group is ordered before changes that affect ts
-- FIXME!!! Should these also pay attention to grave accents?
{'́tʹ?sja⁀', '́cca⁀'},
{'([^́])tʹ?sja⁀', '%1ca⁀'},
{'n[dt]sk', 'n(t)sk'},
{'s[dt]sk', 'sck'},
-- Add / before цз, чж sequences (Chinese words) and assimilate чж
{'cz', '/cz'},
{'čž', '/ĝž'},
-- main changes for affricate assimilation of [dt] + sibilant, including ts;
-- we either convert to "short" variants t͡s, d͡z, etc. or to "long" variants
-- t͡ss, d͡zz, etc.
-- 1. т с, д з across word boundary, also т/с, д/з with explicitly written
-- slash, use long variants.
{'[dt](ʹ?[ ‿⁀/]+)s', 'c%1s'},
{'[dt](ʹ?[ ‿⁀/]+)z', 'ĵ%1z'},
-- 2. тс, дз + vowel use long variants.
{'[dt](ʹ?)s(j?' .. vowels .. ')', 'c%1s%2'},
{'[dt](ʹ?)z(j?' .. vowels .. ')', 'ĵ%1z%2'},
-- 3. тьс, дьз use long variants.
{'[dt]ʹs', 'cʹs'},
{'[dt]ʹz', 'ĵʹz'},
-- 4. word-initial от[сз]-, под[сз]- use long variants because there is
-- a morpheme boundary.
{'(⁀o' .. accents .. '?)t([sz])', ot_pod_sz},
{'(⁀po' .. accents .. '?)d([sz])', ot_pod_sz},
-- 5. other тс, дз use short variants.
{'[dt]s', 'c'},
{'[dt]z', 'ĵ'},
-- 6. тш, дж always use long variants (FIXME, may change)
{'[dt](ʹ?[ %-‿⁀/]*)š', 'ĉ%1š'},
{'[dt](ʹ?[ %-‿⁀/]*)ž', 'ĝ%1ž'},
-- 7. soften palatalized hard hushing affricates resulting from the previous
{'ĉʹ', 'č'},
{'ĝʹ', 'ǰ'},
-- changes that generate ɕː and ɕč through assimilation:
-- зч and жч become ɕː, as does сч at the beginning of a word and in the
-- sequence счёт when not following [цдт] (подсчёт); else сч becomes ɕč
-- (отсчи́тываться), as щч always does (рассчитáть written ращчита́ть)
{'[cdt]sč', 'čɕː'},
{'ɕːč', 'ɕč'},
{'[zž]č', 'ɕː'},
{'[szšž]ɕː?', 'ɕː'},
{'⁀sč', '⁀ɕː'},
{'sčjo(' .. accents .. '?)t', 'ɕːjo%1t'},
{'sč', 'ɕč'},
-- misc. changes for assimilation of [dtsz] + sibilants and affricates
{'[sz][dt]c', 'sc'},
{'([rn])[dt]([cč])', '%1%2'},
{'[dt]([cč])', '%1%1'},
-- the following is ordered before the next one, which applies assimilation
-- of [тд] to щ (including across word boundaries)
{'n[dt]ɕ', 'nɕ'},
-- [сз] and [сз]ь before soft affricates [щч], including across word
-- boundaries; note that the common sequence сч has already been handled
{'[zs]ʹ?([ ‿⁀/]*[ɕč])', 'ɕ%1'},
-- reduction of too many ɕ's, which can happen from the previous
{'ɕɕː', 'ɕː'},
-- assimilation before [тдц] and [тдц]ь before щ
{'[cdt]ʹ?([ ‿⁀/]*)ɕ', 'č%1ɕ'},
-- assimilation of [сз] and [сз]ь before [шж]
{'[zs]([ ‿⁀/]*)š', 'š%1š'},
{'[zs]([ ‿⁀/]*)ž', 'ž%1ž'},
{'[zs]ʹ([ ‿⁀/]*)š', 'ɕ%1š'},
{'[zs]ʹ([ ‿⁀/]*)ž', 'ӂ%1ž'},
{'sverxi', 'sverxy'},
{'stʹd', 'zd'},
{'tʹd', 'dd'},
-- loss of consonants in certain clusters
{'([ns])[dt]g', '%1g'},
{'zdn', 'zn'},
{'lnc', 'nc'},
{'[sz]t([ln])', 's%1'},
-- backing of /i/ after hard consonants in close juncture
{'([mnpbtdkgfvszxɣrlšžcĵĉĝ])⁀‿⁀i', '%1⁀‿⁀y'},
}
local cons_assim_palatal = {
-- assimilation of tn, dn, nč, nɕ is handled specially
compulsory = ut.list_to_set({'stʲ', 'zdʲ', 'ntʲ', 'ndʲ', 'xkʲ',
'csʲ', 'ĵzʲ', 'ncʲ', 'nĵʲ'}),
optional = ut.list_to_set({'slʲ', 'zlʲ', 'snʲ', 'znʲ', 'nsʲ', 'nzʲ',
'mpʲ', 'mbʲ', 'mfʲ', 'fmʲ'})
}
-- words which will be treated as accentless (i.e. their vowels will be
-- reduced), and which will liaise with a preceding or following word;
-- this will not happen if the words have an accent mark, cf.
-- по́ небу vs. по не́бу, etc.
local accentless = {
-- class 'pre': particles that join with a following word
pre = ut.list_to_set({'bez', 'bliz', 'v', 'vo', 'do',
'iz-pod', 'iz-za', 'za', 'iz', 'izo',
'k', 'ko', 'mež', 'na', 'nad', 'nado', 'ob', 'obo', 'ot',
'po', 'pod', 'podo', 'pred', 'predo', 'pri', 'pro', 'pered', 'peredo',
'čerez', 's', 'so', 'u', 'ne'}),
-- class 'prespace': particles that join with a following word, but only
-- if a space (not a hyphen) separates them; hyphens are used here
-- to spell out letters, e.g. а-эн-бэ́ for АНБ (NSA = National Security
-- Agency) or о-а-э́ for ОАЭ (UAE = United Arab Emirates)
prespace = ut.list_to_set({'a', 'o'}),
-- class 'post': particles that join with a preceding word
post = ut.list_to_set({'libo', 'nibudʹ', 'by', 'b', 'že', 'ž',
'ka', 'tka', 'li'}),
-- class 'posthyphen': particles that join with a preceding word, but only
-- if a hyphen (not a space) separates them
posthyphen = ut.list_to_set({'to'}),
}
-- Pronunciation of final unstressed -е, depending on the part of speech and
-- exact ending.
--
-- Endings:
-- oe = -ое
-- ve = any other vowel plus -е (FIXME, may have to split out -ее)
-- je = -ье
-- softpaired = soft paired consonant + -е
-- hardsib = hard sibilant (ц, ш, ж) + -е
-- softsib = soft sibilant (ч, щ) + -е
--
-- Parts of speech:
-- def = default used in absence of pos
-- n/noun = neuter noun in the nominative/accusative singular (but not ending
-- in adjectival -ое or -ее; those should be considered as adjectives)
-- pre = prepositional case singular
-- dat = dative case singular (treated same as prepositional case singular)
-- voc = vocative case (currently treated as 'mid')
-- nnp = noun nominative plural in -е (гра́ждане, боя́ре, армя́не); not
-- adjectival plurals in -ие or -ые, including adjectival nouns
-- (да́нные, а́вторские)
-- inv = invariable noun or other word (currently treated as 'mid')
-- a/adj = adjective or adjectival noun (typically either neuter in -ое or
-- -ее, or plural in -ие, -ые, or -ье, or short neuter in unpaired
-- sibilant + -е)
-- c/com = comparative (typically either in -ее or sibilant + -е)
-- adv = adverb
-- p = preposition (treated same as adverb)
-- v/vb/verb = finite verbal form (usually 2nd-plural in -те); not
-- participle forms, which should be treated as adjectives
-- pro = pronoun (кое-, какие-, ваше, сколькие)
-- num = number (двое, трое, обе, четыре; currently treated as 'mid')
-- pref = prefix (treated as 'high' because integral part of word)
-- hi/high = force high values ([ɪ] or [ɨ])
-- mid = force mid values ([e] or [ɨ])
-- lo/low/schwa = force low, really schwa, values ([ə])
--
-- Possible values:
-- 1. ə [ə], e [e], i [ɪ] after a vowel or soft consonant
-- 2. ə [ə] or y [ɨ] after a hard sibilant
--
-- If a part of speech doesn't have an entry for a given type of ending,
-- it receives the default value. If a part of speech's entry is a string,
-- it's an alias for another way of specifying the same part of speech
-- (e.g. n=noun).
local final_e = {
def={oe='ə', ve='e', je='e', softpaired='e', hardsib='y', softsib='e'},
noun={oe='ə', ve='e', je='e', softpaired='e', hardsib='ə', softsib='e'},
n='noun',
pre={oe='e', ve='e', softpaired='e', hardsib='y', softsib='e'},
dat='pre',
voc='mid',
nnp={softpaired='e'}, -- FIXME, not sure about this
inv='mid', --FIXME, not sure about this (e.g. вице-, кофе)
adj={oe='ə', ve='e', je='ə'}, -- FIXME: Not sure about -ее, e.g. neut adj си́нее; FIXME, not sure about short neuter adj, e.g. похо́же from похо́жий, дорогосто́яще from дорогосто́ящий, should this be treated as neuter noun?
a='adj',
com={ve='e', hardsib='y', softsib='e'},
c='com',
adv={softpaired='e', hardsib='y', softsib='e'},
p='adv', --FIXME, not sure about prepositions
verb={softpaired='e'},
v='verb',
vb='verb',
pro={oe='i', ve='i'}, --FIXME, not sure about ваше, сколькие, какие-, кое-
num='mid', --FIXME, not sure about обе
pref='high',
-- forced values
high={oe='i', ve='i', je='i', softpaired='i', hardsib='y', softsib='i'},
hi='high',
mid={oe='e', ve='e', je='e', softpaired='e', hardsib='y', softsib='e'},
low={oe='ə', ve='ə', je='ə', softpaired='ə', hardsib='ə', softsib='ə'},
lo='low',
schwa='low'
}
local function ine(x)
return x ~= "" and x or nil
end
local function track(page)
local m_debug = require("Module:debug")
m_debug.track("ru-pron/" .. page)
return true
end
-- For use with {{ru-IPA|phon=...}}; remove accents that we don't want
-- to appear in the phonetic respelling
function export.phon_respelling(text)
if type(text) == 'table' then
text = ine(text.args[1])
end
text = rsub(text, '[' .. CFLEX .. DUBGR .. DOTABOVE .. DOTBELOW .. ']', '')
return text
end
function export.ipa(text, adj, gem, bracket, pos)
local new_module_result
-- Test code to compare existing module to new one.
if test_new_ru_pron_module then
local m_new_ru_pron = require("Module:User:Benwing2/ru-pron")
new_module_result = m_new_ru_pron.ipa(text, adj, gem, bracket, pos)
end
if type(text) == 'table' then
text, adj, gem, bracket, pos = (ine(text.args.phon) or ine(text.args[1])), ine(text.args.adj), ine(text.args.gem), ine(text.args.bracket), ine(text.args.pos)
if not text then
text = mw.title.getCurrentTitle().text
end
end
gem = usub(gem or '', 1, 1)
bracket = ine(usub(bracket or '', 1, 1))
if bracket == 'n' then
bracket = nil
end
pos = pos or "def"
-- If a multipart part of speech, split into components, and convert
-- each blank component to the default.
if rfind(pos, "/") then
pos = rsplit(pos, "/")
for i=1,#pos do
if pos[i] == "" then
pos[i] = "def"
end
end
end
-- Verify that pos (or each part of multipart pos) is recognized
for _, p in ipairs(type(pos) == "table" and pos or {pos}) do
if not final_e[pos] then
error("Unrecognized part of speech '" .. pos .. "': Should be n/noun/neut, a/adj, c/com, pre, dat, adv, inv, voc, v/verb, pro, hi/high, mid, lo/low/schwa or omitted")
end
end
text = ulower(text)
if gem ~= '' then
track("gem")
track("gem/" .. gem)
end
if adj then
track("adj")
end
if rfind(text, "[a-zščžáéíóúýàèìòùỳ]") then
track("latin-text")
end
if rfind(text, "[сз]ч") then
track("sch")
end
if rfind(text, "[шж]ч") then
track("shch")
end
if rfind(text, CFLEX) then
track("cflex")
end
if rfind(text, DUBGR) then
track("dubgr")
end
text = rsub(text, "``", DUBGR)
text = rsub(text, "`", GR)
text = rsub(text, "@", DOTABOVE)
text = rsub(text, "%^", CFLEX)
text = rsub(text, DUBGR, CFLEX)
-- translit doesn't always convert э to ɛ (depends on whether a consonant
-- precedes), so do it ourselves before translit
text = rsub(text, 'э', 'ɛ')
-- vowel + йе should have double jj, but the translit module will translit
-- it the same as vowel + е, so do it ourselves before translit
text = rsub(text, '([' .. com.vowel .. ']' .. com.opt_accent .. ')й([еѐ])',
'%1йй%2')
-- transliterate and decompose Latin vowels with accents, recomposing
-- certain key combinations
text = com.translit(text)
-- handle old ě (e.g. сѣдло́), and ě̈ from сѣ̈дла
text = rsub(text, 'ě̈', 'jo' .. AC)
text = rsub(text, 'ě', 'e')
-- handle sequences of accents (esp from ё with secondary/tertiary stress)
text = rsub(text, accents .. '+(' .. accents .. ')', '%1')
-- canonicalize multiple spaces
text = rsub(text, '%s+', ' ')
-- Add primary stress to single-syllable words preceded or followed by
-- unstressed particle or preposition. Add "tertiary" stress to remaining
-- single-syllable words that aren't a particle, preposition, prefix or
-- suffix and don't already bear an accent (including force-reduction
-- accents, i.e. dot-above/dot-below); "tertiary stress" means a vowel is
-- treated as stressed for the purposes of vowel reduction but isn't
-- marked with a primary or secondary stress marker; we repurpose a
-- circumflex for this purpose. We need to preserve the distinction
-- between spaces and hyphens because (1) we only recognize certain
-- post-accentless particles following a hyphen (to distinguish e.g.
-- 'то' from '-то'); (2) we only recognize certain pre-accentless
-- particles preceding a space (to distinguish particles 'о' and 'а' from
-- spelled letters о and а, which should not be reduced); and (3) we
-- recognize hyphens for the purpose of marking unstressed prefixes and
-- suffixes.
local word = strutils.capturing_split(text, "([ %-]+)")
for i = 1, #word do
-- check for single-syllable words that need a stress; they must meet
-- the following conditions:
-- 1. must not be an accentless word, which is any of the following:
-- 1a. in the "pre" class, or
if not (accentless['pre'][word[i]] or
-- 1b. in the "prespace" class if followed by space and another word, or
i < #word - 1 and accentless['prespace'][word[i]] and word[i+1] == " " or
-- 1c. in the "post" class if preceded by another word, or
i > 2 and accentless['post'][word[i]] or
-- 1d. in the "posthyphen" class preceded by a hyphen and another word;
i > 2 and accentless['posthyphen'][word[i]] and word[i-1] == "-") and
-- 2. must be one syllable;
ulen(rsub(word[i], '[^' .. vow .. ']', '')) == 1 and
-- 3. must not have any accents (including dot-above, forcing reduction);
not rfind(word[i], accents) and
-- 4. must not be a prefix or suffix, identified by a preceding or trailing hyphen, i.e. one of the following:
-- 4a. utterance-initial preceded by a hyphen, or
not (i == 3 and word[2] == "-" and word[1] == "" or
-- 4b. non-utterance-initial preceded by a hyphen, or
i >= 3 and word[i-1] == " -" or
-- 4c. utterance-final followed by a hyphen, or
i == #word - 2 and word[i+1] == "-" and word[i+2] == "" or
-- 4d. non-utterance-final followed by a hyphen;
i <= #word - 2 and word[i+1] == "- ") then
-- OK, we have a stressable single-syllable word; either add primary
-- or tertiary stress:
-- 1. add primary stress if preceded or followed by an accentless word,
if (i > 2 and accentless['pre'][word[i-2]] or
i > 2 and word[i-1] == " " and accentless['prespace'][word[i-2]] or
i < #word - 1 and accentless['post'][word[i+2]] or
i < #word - 1 and word[i+1] == "-" and accentless['posthyphen'][word[i+2]]) then
word[i] = rsub(word[i], vowels_c, '%1' .. AC)
-- 2. else add tertiary stress
else
word[i] = rsub(word[i], vowels_c, '%1' .. CFLEX)
end
end
end
-- make unaccented prepositions and particles liaise with the following or
-- preceding word
for i = 1, #word do
if i < #word - 1 and (accentless['pre'][word[i]] or accentless['prespace'][word[i]] and word[i+1] == " ") then
word[i+1] = '‿'
elseif i > 2 and (accentless['post'][word[i]] or accentless['posthyphen'][word[i]] and word[i-1] == "-") then
word[i-1] = '‿'
end
end
-- rejoin words, convert hyphens to spaces and eliminate stray spaces
-- resulting from this
text = table.concat(word, "")
text = rsub(text, '[%-%s]+', ' ')
text = rsub(text, '^ ', '')
text = rsub(text, ' $', '')
-- convert commas and en/en dashes to IPA foot boundaries
text = rsub(text, '%s*[,–—]%s*', ' | ')
-- add a ⁀ at the beginning and end of every word and at close juncture
-- boundaries; we will remove this later but it makes it easier to do
-- word-beginning and word-end rsubs
text = rsub(text, ' ', '⁀ ⁀')
text = '⁀' .. text .. '⁀'
text = rsub(text, '‿', '⁀‿⁀')
-- save original word spelling before respellings, (de)voicing changes,
-- geminate changes, etc. for implementation of geminate_pref
local orig_word = rsplit(text, " ", true)
-- insert or remove /j/ before [aou] so that palatal versions of these
-- vowels are always preceded by /j/ and non-palatal versions never are
-- (do this before the change below adding tertiary stress to final
-- palatal о):
-- (1) Non-palatal [ou] after always-hard шж (e.g. in брошю́ра, жю́ри)
-- despite the spelling (FIXME, should this also affect [a]?)
text = rsub(text, '([šž])j([ou])', '%2%3')
-- (2) Palatal [aou] after always-soft щчӂ and voiced variant ǰ (NOTE:
-- this happens before the change šč -> ɕː in phon_respellings)
text = rsub(text, '([čǰӂ])([aou])', '%1j%2')
-- (3) ьо is pronounced as ьйо, i.e. like (possibly unstressed) ьё, e.g.
-- in Асунсьо́н
text = rsub(text, 'ʹo', 'ʹjo')
-- add tertiary stress to some final -о (this needs to be done before
-- eliminating dot-above, after adding ⁀, after adding /j/ before palatal о):
-- (1) after vowels, e.g. То́кио
text = rsub(text, '(' .. vowels .. accents .. '?o)⁀', '%1' .. CFLEX .. '⁀')
-- (2) when palatal, e.g. ра́нчо, га́учо, ма́чо, Ога́йо
text = rsub(text, 'jo⁀', 'jo' .. CFLEX .. '⁀')
-- eliminate dot-above, which has served its purpose of preventing any
-- sort of stress
text = rsub(text, DOTABOVE, '')
-- eliminate dot-below
text = rsub(text, 'ja' .. DOTBELOW, 'jạ')
if rfind(text, DOTBELOW) then
error("Dot-below accent can only be placed on я or palatal а")
end
text = adj and rsub(text, '(.[aoe]́?)go(' .. AC .. '?)⁀', '%1vo%2⁀') or text
text = adj and rsub(text, '(.[aoe]́?)go(' .. AC .. '?)⁀', '%1vo%2sja⁀') or text
--phonetic respellings
for _, respell in ipairs(phon_respellings) do
text = rsub(text, respell[1], respell[2])
end
--voicing, devoicing
--NOTE: v before an obstruent assimilates in voicing and triggers voicing
--assimilation of a preceding consonant; neither happens before a sonorant
--1. absolutely final devoicing
text = rsub(text, '([bdgvɣzžĝĵǰӂ])(ʹ?⁀)$', function(a, b)
return devoicing[a] .. b end)
--2. word-final devoicing before another word
text = rsub(text, '([bdgvɣzžĝĵǰӂ])(ʹ?⁀ ⁀[^bdgɣzžĝĵǰӂ])', function(a, b)
return devoicing[a] .. b end)
--3. voicing/devoicing assimilation; repeat to handle recursive assimilation
while true do
local new_text = rsub(text, '([bdgvɣzžĝĵǰӂ])([ ‿⁀ʹː()/]*[ptkfxsščɕcĉ])', function(a, b)
return devoicing[a] .. b end)
new_text = rsub(new_text, '([ptkfxsščɕcĉ])([ ‿⁀ʹː()/]*v?[ ‿⁀ʹː()/]*[bdgɣzžĝĵǰӂ])', function(a, b)
return voicing[a] .. b end)
if new_text == text then
break
end
text = new_text
end
--re-notate orthographic geminate consonants
text = rsub(text, '([^' .. vow .. '.%-_])' .. '%1', '%1ː')
text = rsub(text, '([^' .. vow .. '.%-_])' .. '%(%1%)', '%1(ː)')
--rewrite iotated vowels
text = rsub(text, '(j[%(ː%)]*)([aeou])', function(a, b)
return a .. iotating[b] end)
-- eliminate j after consonant and before iotated vowel (including
-- semi-reduced ạ)
text = rsub(text, '([^' .. vow .. acc .. 'ʹʺ‿⁀ ]/?)j([äạëöü])', '%1%2')
--split by word and process each word
word = rsplit(text, " ", true)
if type(pos) == "table" and #pos ~= #word then
error("Number of parts of speech (" .. #pos .. ") should match number of combined words (" .. #word .. ")")
end
for i = 1, #word do
local pron = word[i]
-- Check for gemination at prefix boundaries; if so, convert the
-- regular gemination symbol ː to a special symbol ˑ that indicates
-- we always preserve the gemination unless gem=n. We look for
-- certain sequences at the beginning of a word, but make sure that
-- the original spelling is appropriate as well (see comment above
-- for geminate_pref).
if rfind(pron, 'ː') then
local orig_pron = orig_word[i]
local deac = rsub(pron, accents, '')
local orig_deac = rsub(orig_pron, accents, '')
for _, gempref in ipairs(geminate_pref) do
local newspell = gempref[1]
local oldspell = gempref[2]
-- FIXME! The rsub below will be incorrect if there is
-- gemination in a joined preposition or particle
if rfind(orig_deac, '⁀' .. oldspell) and rfind(deac, '⁀' .. newspell) or
rfind(orig_deac, '⁀ne' .. oldspell) and rfind(deac, '⁀ne' .. newspell) then
pron = rsub(pron, '(⁀[^‿⁀ː]*)ː', '%1ˑ')
end
end
end
--degemination, optional gemination
if gem == 'y' then
-- leave geminates alone, convert ˑ to regular gemination; ˑ is a
-- special gemination symbol used at prefix boundaries that we
-- remove only when gem=n, else we convert it to regular gemination
pron = rsub(pron, 'ˑ', 'ː')
elseif gem == 'o' then
-- make geminates optional, except for ɕӂ, also ignore left paren
-- in (ː) sequence
pron = rsub(pron, '([^ɕӂ%(%)])[ːˑ]', '%1(ː)')
elseif gem == 'n' then
-- remove gemination, except for ɕӂ
pron = rsub(pron, '([^ɕӂ%(%)])[ːˑ]', '%1')
else
-- degeminate l's
pron = rsub(pron, '(l)ː', '%1')
-- preserve gemination between vowels immediately after the stress,
-- special gemination symbol ˑ also remains, ɕӂ remain geminated,
-- žn remain geminated between vowels even not immediately after
-- the stress, n becomes optionally geminated when after but not
-- immediately after the stress, ssk and zsk remain geminated
-- immediately after the stress, else degeminate; we signal that
-- gemination should remain by converting to special symbol ˑ,
-- then removing remaining ː not after ɕӂ and left paren; do
-- various subs repeatedly in case of multiple geminations in a word
-- 1. immediately after the stress
pron = rsub_repeatedly(pron, '(' .. vowels .. accents .. '[^ɕӂ%(%)])ː(' .. vowels .. ')', '%1ˑ%2')
-- 2. remaining geminate n after the stress between vowels
pron = rsub_repeatedly(pron, '(' .. AC .. '.-' .. vowels .. accents .. '?n)ː(' .. vowels .. ')', '%1(ː)%2')
-- 3. remaining ž and n between vowels
pron = rsub_repeatedly(pron, '(' .. vowels .. accents .. '?[žn])ː(' .. vowels .. ')', '%1ˑ%2')
-- 4. ssk (and zsk, already normalized) immediately after the stress
pron = rsub(pron, '(' .. vowels .. accents .. '[^' .. vow .. ']*s)ː(k)', '%1ˑ%2')
-- 5. eliminate remaining gemination
pron = rsub(pron, '([^ɕӂ%(%)])ː', '%1')
-- 6. convert special gemination symbol ˑ to regular gemination
pron = rsub(pron, 'ˑ', 'ː')
end
-- handle soft and hard signs, assimilative palatalization
-- 1. insert j before i when required
pron = rsub(pron, 'ʹi', 'ʹji')
-- 2. insert glottal stop after hard sign if required
pron = rsub(pron, 'ʺ([aɛiouy])', 'ʔ%1')
-- 3. assimilative palatalization of consonants when followed by
-- front vowels or soft sign
pron = rsub(pron, '([mnpbtdkgfvszxɣrl])([ː()]*[eiäạëöüʹ])', '%1ʲ%2')
pron = rsub(pron, '([cĵ])([ː()]*[äạöüʹ])', '%1ʲ%2')
-- 4. remove hard and soft signs
pron = rsub(pron, "[ʹʺ]", "")
-- reduction of unstressed word-final -я, -е; but special-case
-- unstressed не, же. Final -я always becomes [ə]; final -е may
-- become [ə], [e], [ɪ] or [ɨ] depending on the part of speech and
-- the preceding consonants/vowels.
pron = rsub(pron, '[äạ]⁀', 'ə⁀')
pron = rsub(pron, '⁀nʲe⁀', '⁀nʲi⁀')
pron = rsub(pron, '⁀že⁀', '⁀žy⁀')
-- function to fetch the appropriate value for ending and part of
-- speech, handling aliases and defaults and converting 'e' to 'ê'
-- so that the unstressed [e] sound is preserved
function fetch_e_sub(ending)
local thispos = type(pos) == "table" and pos[i] or pos
local chart = final_e[thispos]
while type(chart) == "string" do -- handle aliases
chart = final_e[chart]
end
assert(type(chart) == "table")
local sub = chart[ending] or final_e['def'][ending]
assert(sub)
if sub == 'e' then
-- add CFLEX to preserve the unstressed [e] sound, which
-- will otherwise be converted to [ɪ]; NOTE: DO NOT use ê
-- here directly because it's a single composed char, when
-- we need the e and accent to be separate
return 'e' .. CFLEX
else
return sub
end
end
if new_final_e_code then
-- handle substitutions in two parts, one for vowel+j+e sequences
-- and the other for cons+e sequences
pron = rsub(pron, vowels_c .. '(' .. accents .. '?j)ë⁀', function(v, ac)
local ty = v == 'o' and 'oe' or 've'
return v .. ac .. fetch_e_sub(ty)
end)
-- consonant may palatalized, geminated or optional-geminated
pron = rsub(pron, '(.)(ʲ?[ː()]*)[eë]⁀', function(ch, mod)
local ty = ch == 'j' and 'je' or
rfind(ch, '[cĵšžĉĝ]') and 'hardsib' or
rfind(ch, '[čǰɕӂ]') and 'softsib' or
'softpaired'
return ch ..mod .. fetch_e_sub(ty)
end)
else
-- Do the old way, which mostly converts final -е to schwa, but
-- has highly broken retraction code for vowel + [шжц] + е (but
-- not with accent on vowel!) before it that causes final -е in
-- this circumstance to become [ɨ], and a special hack for кое-.
pron = rsub(pron, vowels_c .. '([cĵšžĉĝ][ː()]*)[eë]', '%1%2ɛ')
pron = rsub(pron, '⁀ko(' .. accents .. ')jë⁀', '⁀ko%1ji⁀')
pron = rsub(pron, '[eë]⁀', 'ə⁀')
end
-- retraction of е and и after цшж
pron = rsub(pron, '([cĵšžĉĝ][ː()]*)([ei])', function(a, b)
return a .. retracting[b] end)
--syllabify, inserting @ at syllable boundaries
--1. insert @ after each vowel
pron = rsub(pron, '(' .. vowels .. accents .. '?)', '%1@')
--2. eliminate word-final @
pron = rsub(pron, '@+⁀$', '⁀')
--3. move @ forward directly before any ‿⁀, as long as at least
-- one consonant follows that; we will move it across ‿⁀ later
pron = rsub(pron, '@([^@' .. vow .. acc .. ']*)([‿⁀]+[^‿⁀@' .. vow .. acc .. '])', '%1@%2')
--4. in a consonant cluster, move @ forward so it's before the
-- last consonant
pron = rsub(pron, '@([^‿⁀@' .. vow .. acc .. ']*)([^‿⁀@' .. vow .. acc .. 'ːˑ()ʲ]ʲ?[ːˑ()]*‿?[' .. vow .. acc .. '])', '%1@%2')
--5. move @ backward if in the middle of a "permanent onset" cluster,
-- e.g. sk, str, that comes before a vowel, putting the @ before
-- the permanent onset cluster
pron = rsub(pron, '([^‿⁀@' .. vow .. acc .. ']?)([^‿⁀@' .. vow .. acc .. '])@([^‿⁀@' .. vow .. acc .. 'ːˑ()ʲ])(ʲ?[ːˑ()]*[‿⁀]*[' .. vow .. acc .. '])', function(a, b, c, d)
if perm_syl_onset[a .. b .. c] or c == 'j' and rfind(b, '[čǰɕӂʲ]') then
return '@' .. a .. b .. c .. d
elseif perm_syl_onset[b .. c] then
return a .. '@' .. b .. c .. d
end end)
--6. if / is present (explicit syllable boundary), remove any @
-- (automatic boundary) and convert / to @
if rfind(pron, '/') then
pron = rsub(pron, '[^' .. vow .. acc .. ']+', function(x)
if rfind(x, '/') then
x = rsub(x, '@', '')
x = rsub(x, '/', '@')
end
return x
end)
end
--7. remove @ followed by a final consonant cluster
pron = rsub(pron, '@([^‿⁀@' .. vow .. ']+⁀)$', '%1')
--8. remove @ preceded by an initial consonant cluster (should only
-- happen when / is inserted by user or in цз, чж sequences)
pron = rsub(pron, '^(⁀[^‿⁀@' .. vow .. ']+)@', '%1')
--9. make sure @ isn't directly before linking ‿⁀
pron = rsub(pron, '@([‿⁀]+)', '%1@')
-- handle word-initial unstressed o and a; note, vowels always
-- followed by at least one char because of word-final ⁀
-- do after syllabification because syllabification doesn't know
-- about ɐ as a vowel
pron = rsub(pron, '^⁀[ao]([^' .. acc .. '])', '⁀ɐ%1')
--split by syllable
local syllable = rsplit(pron, '@', true)
--create set of 1-based syllable indexes of stressed syllables
--(acute, grave, circumflex)
local stress = {}
for j = 1, #syllable do
if rfind(syllable[j], accents) then
stress[j] = true
end
end
-- iterate syllable by syllable to handle stress marks, vowel allophony
local syl_conv = {}
for j = 1, #syllable do
local syl = syllable[j]
local alnum
--vowel allophony
if stress[j] then
-- convert acute/grave/circumflex accent to appropriate
-- IPA marker of primary/secondary/unmarked stress
alnum = 1
syl = rsub(syl, '(.*)́', 'ˈ%1')
syl = rsub(syl, '(.*)̀', 'ˌ%1')
syl = rsub(syl, CFLEX, '')
elseif stress[j+1] then
alnum = 2
else
alnum = 3
end
syl = rsub(syl, vowels_c, function(a)
if a ~= '' then
return allophones[a][alnum]
end end)
syl_conv[j] = syl
end
pron = table.concat(syl_conv, "")
-- Optional (j) before ɪ, which is always unstressed
pron = rsub(pron, "⁀jɪ", "⁀(j)ɪ")
pron = rsub(pron, '([' .. ipa_vow .. '])jɪ', "%1(j)ɪ")
--consonant assimilative palatalization of tn/dn, depending on
--whether [rl] precedes
pron = rsub(pron, '([rl]?)([ˈˌ]?[dt])([ˈˌ]?nʲ)', function(a, b, c)
if a == '' then
return a .. b .. 'ʲ' .. c
else
return a .. b .. '⁽ʲ⁾' .. c
end end)
--general consonant assimilative palatalization
pron = rsub_repeatedly(pron, '([szntdpbmfcĵx])([ˈˌ]?)([szntdpbmfcĵlk]ʲ)', function(a, b, c)
if cons_assim_palatal['compulsory'][a..c] then
return a .. 'ʲ' .. b .. c
elseif cons_assim_palatal['optional'][a..c] then
return a .. '⁽ʲ⁾' .. b .. c
else
return a .. b .. c
end end)
-- further assimilation before alveolopalatals
pron = rsub(pron, 'n([ˈˌ]?)([čǰɕӂ])', 'nʲ%1%2')
-- optional palatal assimilation of вп, вб only word-initially
pron = rsub(pron, '⁀([ˈˌ]?[fv])([ˈˌ]?[pb]ʲ)', '⁀%1⁽ʲ⁾%2')
-- optional palatal assimilation of бв but not in обв-
pron = rsub(pron, 'b([ˈˌ]?vʲ)', 'b⁽ʲ⁾%1')
if rfind(word[i], '⁀o' .. accents .. '?bv') then
-- ə in case of a word with a preceding preposition
pron = rsub(pron, '⁀([ˈˌ]?[ɐəo][ˈˌ]?)b⁽ʲ⁾([ˈˌ]?vʲ)', '⁀%1b%2')
end
if rfind(word[i], 's[äạ]⁀') then
pron = rsub(pron, 'sʲə⁀', 's⁽ʲ⁾ə⁀')
end
word[i] = pron
end
text = table.concat(word, " ")
if bracket then
text = '[' .. text .. ']'
end
-- Front a and u between soft consonants. If between a soft and
-- optionally soft consonant (should only occur in that order, shouldn't
-- ever have a or u preceded by optionally soft consonant),
-- split the result into two. We only split into two even if there
-- happen to be multiple optionally fronted a's and u's to avoid
-- excessive numbers of possibilities (and it simplifies the code).
-- 1. First, temporarily add soft symbol to inherently soft consonants.
text = rsub(text, '([čǰɕӂj])', '%1ʲ')
-- 2. Handle case of [au] between two soft consonants
text = rsub(text, '(ʲ[ː()]*)([auʊ])([ˈˌ]?.ʲ)', function(a, b, c)
return a .. fronting[b] .. c end)
-- 3. Handle [au] between soft consonant and optional j, which is still fronted
text = rsub(text, '(ʲ[ː()]*)([auʊ])([ˈˌ]?%(jʲ%))', function(a, b, c)
return a .. fronting[b] .. c end)
-- 4. Handle case of [au] between soft and optionally soft consonant
if rfind(text, 'ʲ[ː()]*[auʊ][ˈˌ]?.⁽ʲ⁾') then
local opt_hard = rsub(text, '(ʲ[ː()]*)([auʊ])([ˈˌ]?.)⁽ʲ⁾', '%1%2%3')
local opt_soft = rsub(text, '(ʲ[ː()]*)([auʊ])([ˈˌ]?.)⁽ʲ⁾', function(a, b, c)
return a .. fronting[b] .. c .. 'ʲ' end)
text = opt_hard .. ', ' .. opt_soft
end
-- 5. Undo addition of soft symbol to inherently soft consonants.
text = rsub(text, '([čǰɕӂj])ʲ', '%1')
-- convert special symbols to IPA
text = rsub(text, '[cĵ]ʲ', translit_conv_j)
text = rsub(text, '[cčgĉĝĵǰšžɕӂ]', translit_conv)
-- Assimilation involving hiatus of ɐ and ə
text = rsub(text, 'ə([‿⁀]*)[ɐə]', 'ɐ%1ɐ')
-- eliminate ⁀ symbol at word boundaries
-- eliminate _ symbol that prevents assimilations
text = rsub(text, '[⁀_]', '')
text = rsub(text, 'ʐ(ː?)ɛ([^ˈˌ]*)([ˈˌ])', 'ʐ%1ɨ%2%3')
text = rsub(text, 'ʂ(ː?)ɛ([^ˈˌ]*)([ˈˌ])', 'ʂ%1ɨ%2%3')
text = rsub(text, 't͡s(ː?)ɛ([^ˈˌ]*)([ˈˌ])', 't͡s%1ɨ%2%3')
text = rsub(text, 't͡sɛ$', 't͡sə')
if test_new_ru_pron_module then
if new_module_result ~= text then
--error(text .. " || " .. new_module_result)
track("different-pron")
end
end
return text
end
return export
-- For Vim, so we get 4-space tabs
-- vim: set ts=4 sw=4 noet:
- Речь не о баге, а о Ваших неортодоксальных идеях о произношении слов «солнце» и «постный». Нет, не думаю.
Александр Машин обс. 19:19, 23 мая 2015 (UTC)
- Как раз — традиционных и ортодоксальных, а также — грамотно-литературных: с поставленной дикцией, а не с дислексией. All (обсуждение) 23:33, 23 мая 2015 (UTC)
- Можно прослушать эти слова и убедиться в том, что рассматриваемые звуки имеются: солнце (мужское произношение), лес, лез, чрез, низ, бриз, лаз, костный, ко́сный, крёстный, зуд, зоб, слез, транспарантный, явь, червь (муж голос), ферзь, связь (муж голос), мазь (муж голос), джаз, вяз, ...
ЛогопедияПравить
В данном случае, утверждается о дикции некоторых программистов и особенно нерусской национальности (даже, если они родились в СССР). Если бы звук «Л» не произносился в слове Солнце, как и «Т» — в иных словах, то это нибыло бы объектом исправления речи у детей. Для тех, кто не может произносить эти буквы, рекомендуется обратиться к логопедам. Я не собирают учить картавых, но вот несколько программ для исправления речи.
- Автоматизация звука Л в словах
Организуйте автоматизацию звука в форме игровых занятий. Занятия по продолжительности должны занимать 15 — 20 минут для детей до 4,5 лет, старше — 30 минут. Нельзя допускать возникновения утомления у малыша.
Звук «Л» произносится длительно и только при неподвижном языке. Когда язык отрывается от альвеол, получается гласный звук.
- Прежде, чем приступить к автоматизации, ребёнок должен научиться правильно произносить изолированный звук.
- Aвтоматизация звука [л] в словосочетаниях
- Весёлый малыш, гладкий лоб, глубокая лужа, глупая улыбка, голубые волны, кислое молоко, луч солнца, лыжная палка, молочная лапша, оловянная ложка, платье с воланами, плывущая лодка, плыть на плоту, полная луна, сломанная вилка, холодное молоко.
- В данном случае, слово Солнце не отделяется от других в самостоятельное произношение.
Произносить (читать) тексты.
Загадки. Белое одеяло землю одевало. Солнце напекло, одеяло потекло. (Снег)
- Это только из 2-х источников по логопедии.
Ещё урок для картавых детейПравить
2. Артикуляционная характеристика звука [л].
Логопед: Сегодня мы будем проговаривать слова со звуком [л]. Вспомни характеристику звука [л].
Ребёнок выкладывает карточки с изображением символов (улыбка, солнце, колокольчик, забор, синий квадрат, расшифровывает их.
Обсуждение модуля:Ru-pron#Исправлен баг: надо перенести в Модуль. Newyorker (обсуждение) 12:56, 23 мая 2015 (UTC)
- См. обсуждение этого модуля.
Александр Машин обс. 19:21, 23 мая 2015 (UTC)- Для проблем с произношением (особенно у нерусских и невоспитанных детей), существует врач «логопед» и наука «Логопедия». (Примеры в обсуждении) All (обсуждение) 22:59, 23 мая 2015 (UTC)
- А для демагогов существует бан.
Александр Машин обс. 08:05, 24 мая 2015 (UTC)- А с врачами-логопедами слабо поспорить? Newyorker (обсуждение) 14:26, 24 мая 2015 (UTC)
- В слове «Солнце» или «Луна» альвеольно-латеральная (альвеолярный латеральный аппроксимант) «томная» фонема буквы «Л» [ɫ̪].[1] В слове «лень» или «ключ» альвеолярная мягкая «Л» [l] / [l̠]. В слове «ла-ла-ла» или «лапа» зубной или зубно-альвеольный звук буквы «Л» [l̪]. [1] All (обсуждение) 15:28, 24 мая 2015 (UTC)
- А для демагогов существует бан.
- А где же инклюзионизм Традиции? Куда он делся? Newyorker (обсуждение) 03:28, 24 мая 2015 (UTC)
- Инклюзионизм не означает замену научных данных на этимологическое фэнтези.
Александр Машин обс. 08:03, 24 мая 2015 (UTC)- Каких?!!! «АИ» в студию! С примерами и доказательствами, а также литературой и авторами. Не забыть сравнить и школы (2 или 3, а может и больше). И чем больше «АИ», тем интереснее рассматривать данный вопрос будет… С ака. З. и «любительство» мы уже разобрались и посмеялись. Кто следующий? Newyorker (обсуждение) 14:23, 24 мая 2015 (UTC)
- Кстати! Последние звуковые модули в компьютерах, которые сносно и даже хорошо стали произносить русскую речь и читать тексты, уже имеют автоматическое генерирование фонем по МФА и в них можно проследить и проанализировать то, о чём тут пишется и что требует исправлений. Они исправились уже и прислушиваются к замечаниям, поправляясь с багами и ошибками, а «викии» — нет. Newyorker (обсуждение) 14:32, 24 мая 2015 (UTC)
- Смешно… Про питербуржский «самый чистый» русский: На днях мы видели блистательное доказательство этого неуменья петербургских жителей правильно выражаться по-русски. В протоколе 13-го заседания Общества для пособия нуждающимся литераторам и ученым напечатано в пункте 8-м следующее: «Если в каждом образованном человеке значительно развито чувство благородной деликатности, запрещающей не только не напрашиваться на пособие, но и стыдливо принимать пособие добровольное, то оно должно быть ещё сильнее развито в человеке, посвятившем себя литературе или науке» (см. «СПб.» и «Москов. ведом.»). Может ли хоть один москвич допустить такое выражение, явно извращающее смысл речи? Чувство деликатности запрещает не напрашиваться! Запрещает стыдливо принимать!!! Боже мой! Да где же г. Покровский с своим памятным листком ошибок в русском языке? Где А. Д. Галахов, который так громил, бывало, Греча и Ксенофонта Полевого? Хоть бы он вразумил этих петербургских литераторов, не умеющих писать по-русски со смыслом![2] Можно и про московскую школу продемонстрировать, — с «аканиями» в словах. All (обсуждение) 21:20, 24 мая 2015 (UTC)
- Авторитетные источники: вот и вот.
- И кстати, вряд ли участникам интересно читать разговор All с самим собою.
Александр Машин обс. 02:06, 25 мая 2015 (UTC)- Не смеши! С каких это пор эти «источники» стали «авторитетными»?! Кроме того, мы — согласно последовательности сообщений, не сами с собой пока-что общаемся, а поясняем и отвечаем-с. Они, кстати, ссылаются на американцев почему-то. Да и школ по данному вопросу несколько: московская (акающая), питербуржская (шипящая), казанская (экающая), а теперь ещё и «википедишняя» объявилась. Есть ещё и белорусская, надо заметить: на основе которой некоторые современные и продвинутые компьютерные голосовые программы созданы (в том числе и анализатор фонем для программистов и программирования). Newyorker (обсуждение) 23:16, 25 мая 2015 (UTC)
- Инклюзионизм не означает замену научных данных на этимологическое фэнтези.
- Для проблем с произношением (особенно у нерусских и невоспитанных детей), существует врач «логопед» и наука «Логопедия». (Примеры в обсуждении) All (обсуждение) 22:59, 23 мая 2015 (UTC)
РекомендуюПравить
Наиболее распространёнными дефектами произношения является искажение свистящих, шипящих звуков, а также букв «л» и «р».
Очень часто причиной речевых дефектов является сюсюканье и лепетание родителей при разговоре с детками. Таким образом, именно родители закрепляют ошибочное произношение слов. Разговаривая с ребёнком, нужно следить за речью, спокойно, грамотно и чётко произносить слова, следить за правильным формированием артикуляции у крохи.
Неспособность правильно произносить «трудные» звуки может быть связана с анатомическими особенностями речевого аппарата: короткая уздечка языка, мягкое небо, заячья губа. В некоторых случаях дефекты речи появляются в результате невротических расстройств, снижения слуха или перенесения тяжёлого заболевания.
Существует множество приёмов постановки правильного произношения, но в первую очередь рекомендуется добиться произнесения звука путём подражания. Для этого нужно медленно и чётко озвучить трудную букву, а ребёнок должен самостоятельно её повторить. Занятия лучше проводить перед зеркалом, так малыш будет видеть свою артикуляцию и сможет сравнивать её с артикуляцией учителя/родителя. Не всегда получается сформировать правильное произношение на первых занятиях, поэтому родителям придётся запастись терпением и настойчивостью.
Дети с дислексией допускают ошибки при чтении: пропускают звуки, добавляют ненужные, искажают звучание слов, скорость чтения у них невысокая, ребята меняют буквы местами, иногда пропускают начальные слоги слов… Часто страдает способность чётко воспринимать на слух определённые звуки и использовать их в собственной речи, при чтении и письме. Нарушается при этом возможность различения близких звуков: «Б-П», «Д-Т», «К-Г», «С-З», «Ж-Ш». (Надо ещё исправить в этом модуле произношение С/З!)
- Развитие РУССКОГО литературного произношения.
- Развитие произношения буквы Л.
- Развитие произношения буквы Т.
- Неправильные словосочетания: косный мозг (правильно: костный мозг); крёстный ход (правильно: крестный ход); туристское агентство (правильно: туристическое агентство); элитарные войска (правильно: элитные войска, то есть отборные); драматургический театр (правильно: драматический театр).