eSpeak NG is an open source speech synthesizer that supports more than hundred languages and accents.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ph_danish 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. // PB General rules for vowels:
  2. // Short vowels
  3. // ACC: Short "pille" [p?el@-], "andre" [AndRV]
  4. // AC[V]: Short "piler" [p?ilV] - verbs, not nouns, which is a problem
  5. // A[N]: Short "bange" [b?AN@-]
  6. // Long vowels
  7. // A + @- OR V: Long "ae" "aer" [&:@-]
  8. // AC + @- OR V: Long "pile" [pi:l@-]
  9. // AC[i]: Long "smidig" [smi:Di]
  10. phoneme @
  11. vowel starttype #@ endtype #@
  12. unstressed
  13. length 60
  14. FMT(vowel/@_3)
  15. endphoneme
  16. phoneme @- // very short schwa
  17. vowel starttype #@ endtype #@
  18. unstressed nonsyllabic
  19. ipa ə
  20. IF nextPhW(*) OR nextPhW(r) THEN
  21. ipa NULL // @-* is used to make 'r'
  22. ENDIF
  23. length 50
  24. // "femten", "manden" - only a short "n" sound
  25. IF nextPhW(n) THEN
  26. length 15
  27. ENDIF
  28. IF prevPhW(isNotVowel) AND thisPh(isWordEnd) THEN
  29. length 15
  30. ENDIF
  31. // "lige" [li@-]
  32. IF prevPhW(i) AND thisPh(isWordEnd) THEN
  33. length 15
  34. ENDIF
  35. FMT(vowel/@-)
  36. endphoneme
  37. // ToDo: change [@] to [a#] if adjacent to [r] or [R]
  38. phoneme 3
  39. vowel starttype #a endtype #a
  40. unstressed
  41. length 40
  42. FMT(vowel/a#_3)
  43. endphoneme
  44. // PB sort of schwa [ɐ] (0250+032F)
  45. // "spurgt" [sp'o3-d] – ipa [spˈoɐ̯d]
  46. phoneme 3- // used for 'r' after a vowel (to create a diphthong)
  47. liquid
  48. lengthmod 7
  49. ipa ɐ̯
  50. FMT(r/a_)
  51. endphoneme
  52. phoneme i
  53. vowel starttype #i endtype #i
  54. length 140
  55. // Long vowel followed by consonant and @- "gide", "pile"
  56. IF nextPhW(isNotVowel) AND next2PhW(@-) THEN
  57. length 225
  58. ENDIF
  59. // "gider", vrider"
  60. IF nextPhW(D) AND next2PhW(V) OR next2PhW(?V) THEN
  61. length 140
  62. ENDIF
  63. // PB long vowel followed by [@-] - "pigen" [p'i@-n]
  64. IF nextPhW(@-) OR nextPhW(V) THEN
  65. length 225
  66. ENDIF
  67. // "vilje" - short followed by 2 consonants
  68. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  69. length 140
  70. ENDIF
  71. // PB "tie", "stige", "krige" vowel + vowel: extra length
  72. // What is causing this very short [i] in words with final [@-]?
  73. // NOT "galleriet" [g,?&lVR'i@-D]
  74. IF nextPhW(V) OR nextPhW(@) OR nextPhW(@-) AND NOT next2PhW(D) THEN
  75. // length 240
  76. ENDIF
  77. //"skider" short
  78. IF nextPhW(D) AND next2PhW(V) THEN
  79. length 140
  80. ENDIF
  81. //"skideren" long
  82. IF nextPhW(D) AND next2PhW(V) AND next3PhW(V) THEN
  83. length 225
  84. ENDIF
  85. FMT(vowel/i_4)
  86. endphoneme
  87. // PB short i
  88. // sviret vs. svirret
  89. phoneme ?i
  90. vowel starttype #i endtype #i
  91. length 100
  92. IfNextVowelAppend(;)
  93. FMT(vowel/i_4)
  94. endphoneme
  95. // PB English i - Tim
  96. phoneme I
  97. vowel starttype #i endtype #i
  98. length 130
  99. IfNextVowelAppend(;)
  100. FMT(vowel/ii_2)
  101. endphoneme
  102. phoneme e
  103. vowel starttype #e endtype #e
  104. length 140
  105. // "dele", "mene"
  106. IF next2PhW(@-) THEN
  107. length 225
  108. ENDIF
  109. // PB "ring", "ringe"
  110. IF nextPhW(N) THEN
  111. length 140
  112. ENDIF
  113. // PB "enig", "enige", "evig"
  114. IF nextPhW(isNotVowel) AND next2PhW(i) THEN
  115. length 225
  116. ENDIF
  117. // "nedladende" [n'eDl&D@-n@-], "delte" - before 2 consonants: short
  118. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  119. length 140
  120. ENDIF
  121. FMT(vowel/e)
  122. endphoneme
  123. // PB short e
  124. // "skille" vs. "skele", "pille" vs. "pile"
  125. phoneme ?e
  126. vowel starttype #e endtype #e
  127. length 140
  128. // "rigtigt" R makes the e too long
  129. IF prevPhW(R) THEN
  130. length 100
  131. ENDIF
  132. // "sigte" t/d + @- makes the e too long
  133. IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) AND next3PhW(@-) THEN
  134. length 100
  135. ENDIF
  136. FMT(vowel/e)
  137. endphoneme
  138. phoneme E
  139. vowel starttype #e endtype #e
  140. length 140
  141. // no link with next vowel
  142. IF thisPh(isWordEnd) THEN
  143. IfNextVowelAppend(_!)
  144. ENDIF
  145. // "ræve"
  146. IF nextVowel(@-) THEN
  147. length 225
  148. ENDIF
  149. // "ære", "kærester", "ærefrygt" - longer E
  150. IF nextPhW(V) THEN
  151. length 225
  152. ENDIF
  153. // "stædig" [st'EDi] long
  154. IF nextPhW(isNotVowel) AND next2PhW(i) THEN
  155. length 225
  156. ENDIF
  157. // "længe" - short - 2 consonants => 1 consonant
  158. IF nextPhW(N) THEN
  159. length 140
  160. ENDIF
  161. // "værelse" [v'E3-Vls@_!]
  162. IF nextPhW(3-) AND next2PhW(V) THEN
  163. length 100
  164. ENDIF
  165. // "mælkebøtte" - short followed by 2 consonants
  166. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  167. length 140
  168. ENDIF
  169. FMT(vowel/e_mid2)
  170. endphoneme
  171. // PB short E
  172. // "læsse" vs. "læse"
  173. phoneme ?E
  174. vowel starttype #e endtype #e
  175. ipa ε
  176. length 140
  177. // "fred" R makes the E too long
  178. IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
  179. length 100
  180. ENDIF
  181. // "fængsel" N makes the E too long
  182. IF nextPhW(N) THEN
  183. length 100
  184. ENDIF
  185. FMT(vowel/e_mid2)
  186. endphoneme
  187. phoneme &
  188. vowel starttype #e endtype #e
  189. ipa æ
  190. length 140
  191. // "same", "sale", "bade" - consonant + @-: long
  192. // but NOT "hinanden"
  193. IF next2PhW(@-) OR next2PhW(@) AND NOT next3PhW(n) THEN
  194. length 225
  195. ENDIF
  196. // ThisPh + V or @-
  197. // "ae", "aer" vowel + vowel: extra length
  198. IF nextPhW(@-) OR nextPhW(V) THEN
  199. length 260
  200. ENDIF
  201. // "stadig" [st&Di], "stadigt" [st&Dit]
  202. IF nextPhW(isNotVowel) AND next2PhW(i) THEN
  203. length 225
  204. ENDIF
  205. // "Alfie", "alfer" - short before 2 consonants
  206. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  207. length 140
  208. ENDIF
  209. FMT(vowel/ee_2)
  210. endphoneme
  211. // Short &
  212. // e.g. the last a in "staldkarl"
  213. // "sale" vs. "sal"
  214. phoneme ?&
  215. vowel starttype #e endtype #e
  216. length 140
  217. FMT(vowel/ee_2)
  218. endphoneme
  219. // Added for the æ in "dræbt"
  220. phoneme &#
  221. vowel starttype #e endtype #e
  222. length 140
  223. ipa a
  224. FMT(vowel/&)
  225. endphoneme
  226. // PB short &#
  227. // "revl" vs. "tremme"
  228. phoneme ?&#
  229. vowel starttype #e endtype #e
  230. length 120
  231. FMT(vowel/&)
  232. endphoneme
  233. phoneme A // PB changed to a_8
  234. vowel starttype #a endtype #a
  235. length 140
  236. // PB long vowel followed by consonant and certain vowels - "drabelig"
  237. IF nextPhW(isNotVowel) AND next2PhW(#@) OR next2PhW(V) THEN
  238. length 225
  239. ENDIF
  240. // "bange" [bAN@-] - [N] = 2 consonants (ng) => short
  241. IF nextPhW(N) THEN
  242. length 140
  243. ENDIF
  244. // "fare" [f'A:A]
  245. IF nextPhW(A) THEN
  246. length 225
  247. ENDIF
  248. // "gratis"
  249. IF next2PhW(i) THEN
  250. length 225
  251. ENDIF
  252. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  253. length 140
  254. ENDIF
  255. FMT(vowel/a_8)
  256. endphoneme
  257. // PB short A
  258. // "drab" vs. "drabelig"
  259. phoneme ?A
  260. vowel starttype #a endtype #a
  261. length 140
  262. FMT(vowel/a_8)
  263. endphoneme
  264. phoneme u
  265. vowel starttype #u endtype #u
  266. length 140
  267. // "suge", "uge", "bluse", "julegave"
  268. IF nextPhW(@-) OR nextPhW(V) OR next2PhW(@-) OR next2PhW(V)THEN
  269. length 225
  270. ENDIF
  271. // "umulig" [u:m'uli]
  272. IF nextVowel(i) AND nextVowel(isFinalVowel) AND nextVowel(isWordEnd) THEN
  273. length 225
  274. ENDIF
  275. FMT(vowel/u_bck)
  276. endphoneme
  277. // Short u
  278. // "tude" vs. "tuden" - [tuD3] [t?uD@n]
  279. phoneme ?u
  280. vowel starttype #u endtype #u
  281. length 140
  282. // "slutte" t/d + @- makes the u too long
  283. IF nextPhW(t) OR nextPhW(d) AND next2PhW(@-) THEN
  284. length 100
  285. ENDIF
  286. FMT(vowel/u_bck)
  287. endphoneme
  288. phoneme o
  289. vowel starttype #o endtype #o
  290. length 140
  291. // "bore", "borer" [boV] o + V
  292. IF nextPhW(V) OR nextPhW(@-) THEN
  293. length 225
  294. ENDIF
  295. // "kone", "koner" o + consonant + V or @-
  296. IF next2PhW(V) OR next2PhW(@-) THEN
  297. length 225
  298. ENDIF
  299. // "modig" - long vowel after consonant + [i]
  300. IF nextPhW(D) AND next2PhW(i) THEN
  301. length 225
  302. ENDIF
  303. FMT(vowel/o_2)
  304. endphoneme
  305. // PB Short o
  306. // "patron" vs. "kone"
  307. phoneme ?o
  308. vowel starttype #o endtype #o
  309. length 140
  310. FMT(vowel/o_2)
  311. endphoneme
  312. phoneme O
  313. vowel starttype #o endtype #o
  314. length 140
  315. ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
  316. // "sove", "sover" - consonant + @ or V: long
  317. IF next2PhW(@-) OR next2PhW(V) THEN
  318. length 225
  319. ENDIF
  320. // PB "gået" - ThisPh + V or @-
  321. IF nextPhW(V) OR nextPhW(@-) THEN
  322. length 225
  323. ENDIF
  324. // "rådig"
  325. IF nextVowel(i) AND nextVowel(isFinalVowel) THEN
  326. length 225
  327. ENDIF
  328. // "såre", "sårede" [s'O:?OD@-]
  329. IF nextPhW(O) OR nextPhW(?O) THEN
  330. length 225
  331. ENDIF
  332. FMT(vowel/o_5)
  333. endphoneme
  334. // Short O
  335. // "toget" vs. "tåget"
  336. phoneme ?O
  337. vowel starttype #o endtype #o
  338. length 140
  339. FMT(vowel/o_5)
  340. endphoneme
  341. phoneme V
  342. vowel starttype #@ endtype #@
  343. length 140
  344. // "forlig"
  345. IF nextPhW(isNotVowel) AND next2PhW(i) THEN
  346. length 225
  347. ENDIF
  348. // PB "konge" - ng=>n
  349. IF nextPhW(N) THEN
  350. length 140
  351. ENDIF
  352. FMT(vowel/V_4)
  353. endphoneme
  354. // PB Short V
  355. // "forstår" vs. "kåre"
  356. phoneme ?V
  357. vowel starttype #@ endtype #@
  358. length 140
  359. FMT(vowel/V_4)
  360. endphoneme
  361. phoneme 0
  362. vowel starttype #o endtype #o
  363. length 140 //225
  364. IF nextPhW(3) OR nextPhW(V) OR nextPhW(@-) THEN
  365. length 225
  366. ENDIF
  367. FMT(vowel/oo_2)
  368. endphoneme
  369. // Short 0 "sukker"
  370. phoneme ?0
  371. vowel starttype #o endtype #o
  372. length 140
  373. FMT(vowel/oo_2)
  374. endphoneme
  375. phoneme y
  376. vowel starttype #i endtype #i
  377. length 140
  378. // PB long vowel followed by consonant and certain vowels
  379. // "gyde", "gyder"
  380. IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(V) THEN
  381. length 225
  382. ENDIF
  383. // "dydig" [dyDi]
  384. IF nextPhW(isNotVowel) AND next2PhW(i) THEN
  385. length 225
  386. ENDIF
  387. // "syge" [sy@-] vowel + vowel: extra length, but NOT "fyret" [fyVD]
  388. IF nextPhW(@-) OR nextPhW(3) AND NOT next2PhW(D) THEN
  389. length 225
  390. ENDIF
  391. // "tyve"
  392. IF nextPhW(?u) AND next2PhW(@-) THEN
  393. length 225
  394. ENDIF
  395. // "bryde" R makes the y too long
  396. IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
  397. length 180
  398. ENDIF
  399. FMT(vowel/y)
  400. endphoneme
  401. // PB Short y
  402. // "kylling" vs. "kyle", "krybbe" vs. "krybe"
  403. phoneme ?y
  404. vowel starttype #i endtype #i
  405. length 140
  406. // "udrydde" R makes the y too long
  407. IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
  408. length 100
  409. ENDIF
  410. // "hytte" t/d + @- makes the y too long
  411. IF nextPhW(t) OR nextPhW(d) AND next2PhW(@-) THEN
  412. length 100
  413. ENDIF
  414. FMT(vowel/y)
  415. endphoneme
  416. phoneme Y
  417. vowel starttype #i endtype #i
  418. length 225
  419. IF NOT next2Ph(3) AND NOT next2Ph(V) AND NOT next2PhW(@-) AND nextPhW(isNotVowel) THEN
  420. glstop
  421. length 140
  422. ENDIF
  423. IF nextPhW(3) OR nextPhW(V) OR nextPhW(@) THEN
  424. length 225
  425. ENDIF
  426. FMT(vowel/yy)
  427. endphoneme
  428. phoneme W
  429. vowel starttype #@ endtype #@
  430. length 140
  431. // "kløe" vowel + vowel: long
  432. IF nextPhW(@-) THEN
  433. length 225
  434. ENDIF
  435. // "røve" W + 1 consonant + 3 or W or @
  436. IF next2PhW(@-) OR next2PhW(3) THEN
  437. length 225
  438. ENDIF
  439. // "røveri" but NOT "surfer" [sWfV] TEST
  440. IF next2PhW(V) OR next2PhW(?V) AND NOT next2PhW(isFinalVowel) THEN
  441. length 140
  442. ENDIF
  443. // PB "nødig", "nødigt", "kølige" - long
  444. IF nextVowel(i) THEN
  445. length 225
  446. ENDIF
  447. // "møve" [mWw@-] - long
  448. IF nextPhW(w) AND nextVowel(@-) THEN
  449. length 225
  450. ENDIF
  451. // "børnebog" - short
  452. IF nextPhW(r) AND next2PhW(n) AND next3PhW(@-) THEN
  453. length 140
  454. ENDIF
  455. // PB "synge"
  456. IF nextPhW(N) THEN
  457. length 140
  458. ENDIF
  459. FMT(vowel/oe)
  460. endphoneme
  461. // Short W
  462. // "prøv" vs. "prøve"
  463. phoneme ?W
  464. vowel starttype #@ endtype #@
  465. length 140
  466. // "bryllup", "rødder" R makes the y too long
  467. IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
  468. length 100
  469. ENDIF
  470. FMT(vowel/oe)
  471. endphoneme
  472. // Added for the ø in "røv", "røg", "øje" instead of [V3]
  473. phoneme W#
  474. vowel starttype #@ endtype #@
  475. length 140 //225
  476. // PB long vowel followed by consonant and certain vowels
  477. IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(@) OR next2PhW(3) OR next2PhW(V) OR next2PhW(?V) THEN
  478. length 225
  479. ENDIF
  480. FMT(vowel/V)
  481. endphoneme
  482. // Short W#
  483. // "rømme"
  484. phoneme ?W#
  485. vowel starttype #@ endtype #@
  486. length 140
  487. FMT(vowel/V)
  488. endphoneme
  489. phoneme aI
  490. vowel starttype #a endtype #i
  491. length 300
  492. IF NOT next2Ph(3) AND NOT next2Ph(V) AND NOT next2Ph(@-) AND nextPhW(isNotVowel) THEN
  493. glstop
  494. length 225
  495. ENDIF
  496. // "dreje" [dR'aI@-_!]
  497. IF nextPhW(3) OR nextPhW(V) OR nextPhW(@) OR nextPhW(@-) THEN
  498. length 280
  499. ENDIF
  500. // PB "drej" vs. "dreje"
  501. IF thisPh(isWordEnd) THEN
  502. length 140
  503. ENDIF
  504. // "lejde" [l'aId@-_!], "lejder" [l'aIdV_!]
  505. IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(V) THEN
  506. length 190
  507. ENDIF
  508. FMT(vdiph/ai)
  509. endphoneme
  510. // CONSONANTS
  511. // PB added l/3
  512. phoneme l
  513. liquid
  514. lengthmod 7
  515. // [ll] => [-l] - avoid double l
  516. IF nextPhW(l) THEN
  517. // ChangePhoneme(-)
  518. ENDIF
  519. ChangePhoneme(l/3)
  520. // CALL base/l
  521. endphoneme
  522. phoneme l/3 // Replacement for [l/]
  523. liquid
  524. lengthmod 7
  525. IF nextPhW(isVowel) THEN
  526. // ChangePhoneme(l)
  527. ENDIF
  528. PrevVowelEndings
  529. VowelEnding(l/l_@)
  530. VowelEnding(l/l_a)
  531. VowelEnding(l/l_e, -50) // hjælpe
  532. VowelEnding(l/l_i, -70) // flygte?
  533. VowelEnding(l/l_o, -60) // stole, skole, hjulpet
  534. VowelEnding(l/l_u, -70)
  535. EndSwitch
  536. // IF nextPh(isLiquid) THEN
  537. // FMT(l/_l)
  538. // ENDIF
  539. FMT(l/l_)
  540. endphoneme
  541. phoneme v // approximant, not fricative
  542. import_phoneme base/v#
  543. voicingswitch f
  544. endphoneme
  545. // PB Actually a kind of schwa = [ɐ]? - "byder" [bˈyðɐʌ]
  546. phoneme r // used for 'r' after a vowel (to create a diphthong)
  547. liquid
  548. lengthmod 7
  549. ipa ɐ̯
  550. IF nextPhW(isVowel) AND NOT nextPhW(?V) AND NOT nextPhW(V) AND NOT nextPhW(@-) THEN
  551. ChangePhoneme(R)
  552. ENDIF
  553. FMT(r/a_)
  554. endphoneme
  555. phoneme R
  556. lengthmod 6
  557. liquid
  558. ipa ʁ
  559. FMT(r/aa)
  560. endphoneme
  561. // don't weaken consonants at end of word or before a stop
  562. phoneme s
  563. vls alv frc sibilant
  564. voicingswitch z
  565. lengthmod 3
  566. Vowelin f1=0 f2=1700 -300 300 f3=-100 80
  567. Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
  568. IF nextPh(p) OR nextPh(t) OR nextPh(k) THEN
  569. WAV(ufric/s!)
  570. ENDIF
  571. WAV(ufric/s)
  572. endphoneme
  573. phoneme p
  574. vls blb stop
  575. voicingswitch b
  576. lengthmod 7
  577. Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 amp=11
  578. Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=22
  579. IF nextPh(isPause2) THEN
  580. WAV(ustop/p_unasp)
  581. ELIF nextPh(r) THEN
  582. WAV(ustop/pr, 70)
  583. ELIF nextPh(R) OR nextPh(R2) THEN
  584. WAV(ustop/pr)
  585. ELIF nextPh(@-) THEN
  586. WAV(ustop/p_unasp)
  587. ELIF nextPh(l) THEN
  588. WAV(ustop/pl)
  589. ENDIF
  590. WAV(ustop/p)
  591. endphoneme
  592. phoneme t
  593. vls alv stop
  594. voicingswitch d
  595. lengthmod 7
  596. Vowelin f1=0 f2=1700 -300 300 f3=-100 80
  597. Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
  598. IF nextPh(r) OR nextPh(R) OR nextPh(R2) THEN
  599. WAV(ustop/tr)
  600. ENDIF
  601. // "respekt" [REsp'Egd]
  602. IF thisPh(isWordEnd) THEN
  603. // ChangePhoneme(d)
  604. ENDIF
  605. WAV(ustop/t, 90)
  606. endphoneme
  607. phoneme j
  608. liquid palatal
  609. lengthmod 7
  610. // no link with next vowel
  611. IF thisPh(isWordEnd) THEN
  612. IfNextVowelAppend(_!)
  613. ENDIF
  614. IF nextPhW(isVowel) THEN
  615. NextVowelStarts
  616. VowelStart(j/j@)
  617. VowelStart(j/ja)
  618. VowelStart(j/je,-35)
  619. VowelStart(j/ji)
  620. VowelStart(j/jo,-65) // "kjole"
  621. VowelStart(j/ju)
  622. EndSwitch
  623. Vowelout len=70
  624. VowelEnding(j/xj, -30)
  625. IF prevPh(isPause) THEN
  626. FMT(j/_j)
  627. ENDIF
  628. ELSE
  629. // no vowel follows
  630. Vowelout len=70
  631. FMT(j/j_)
  632. ENDIF
  633. endphoneme