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 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  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. // Change the length of SHORT vowels (?+vowel)
  11. procedure ShortVowelLength
  12. // "endelig", "ånder" - Short initial vowel sounds too short TEST
  13. IF thisPh(isWordStart) AND nextPhW(n) THEN
  14. IF next2PhW(@-) OR next2PhW(V) THEN
  15. length 160
  16. RETURN
  17. ENDIF
  18. ENDIF
  19. // "slutte" t/d + @- makes the vowel too long
  20. // Problem with compounds like "spildedamp"
  21. IF next2PhW(@-) OR next2PhW(V) THEN
  22. IF nextPhW(t) OR nextPhW(d) THEN
  23. // length 100
  24. LengthAdd -45
  25. // Don't shorten it further if it comes after an "r" sound
  26. // Exit the procedure
  27. RETURN
  28. ENDIF
  29. ENDIF
  30. // "bygget", "byggede" - consonant + [@-D] makes the vowel too long
  31. IF next2PhW(@-) THEN
  32. IF next3PhW(t) OR next3PhW(d) OR next3PhW(D) THEN
  33. IF thisPh(isFirstVowel) THEN // NOT "cellof'anet"
  34. IF NOT thisPh(?V) THEN // NOT "fjollet"
  35. LengthAdd -40
  36. // Don't shorten it further if it comes after an "r" sound ("brygget")
  37. // Exit the procedure
  38. RETURN
  39. ENDIF
  40. ENDIF
  41. ENDIF
  42. ENDIF
  43. // "bygger" - consonant + [V] makes the vowel too long
  44. IF nextPhW(isNotVowel) AND next2PhW(V) THEN
  45. IF NOT thisPh(isWordStart) THEN // NOT "eller"
  46. // LengthAdd -45
  47. // Don't shorten it further if it comes after an "r" sound ("brygger")
  48. // Exit the procedure
  49. RETURN
  50. ENDIF
  51. ENDIF
  52. // "rigtigt", "fred", "frem", "centralen" - R makes the vowel too long
  53. IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
  54. // length 100
  55. LengthAdd -40
  56. RETURN
  57. ENDIF
  58. // "ring", "ringe", "fængsel", "spinkel", "vindspejl"
  59. IF nextPhW(isNasal) THEN
  60. // length 100
  61. LengthAdd -30
  62. RETURN
  63. ENDIF
  64. // "sigte", "bælte", "henter" t/d + @-/V makes the vowel too long
  65. IF nextPhW(isNotVowel) AND next2PhW(t) OR next2PhW(d) THEN
  66. IF next3PhW(@-) OR next3PhW(V) THEN
  67. IF thisPh(isFirstVowel) THEN // NOT [i] in "forsp'ildte"
  68. // length 100
  69. LengthAdd -30
  70. ENDIF
  71. ENDIF
  72. ENDIF
  73. // "forbandelse" [n@-] makes the vowel too long?
  74. // nasal eg: m, n, N
  75. IF nextPhW(isNasal) AND next2PhW(@-) THEN
  76. IF NOT thisPh(isFirstVowel) AND thisPh(isStressed) THEN
  77. // NOT LengthAdd since [R] might have shortend the vowel above
  78. length 100
  79. ENDIF
  80. ENDIF
  81. // "himlen" l/3 makes the vowel too long
  82. IF nextPhW(isNotVowel) AND next2PhW(l/3) AND next3PhW(@-) OR next3PhW(V) THEN
  83. length 100
  84. ENDIF
  85. // "lænkerne" l/3 makes the vowel too long
  86. IF prevPh(l/3) AND nextPhW(isNotVowel) AND next3PhW(V) THEN
  87. length 120
  88. ENDIF
  89. //"musikken" consonant + [@-n] makes the vowel too long
  90. // Probably wrong. Only k?
  91. IF nextPhW(k) AND next2PhW(@-) AND next3PhW(n) THEN
  92. length 100
  93. ENDIF
  94. //"svælge" [svElj@-] vowel + 2 consonants but length 100 is too short
  95. IF nextPhW(isNotVowel) AND next2PhW(j) THEN
  96. length 140
  97. ENDIF
  98. endprocedure
  99. // Change the length of NORMAL vowels (without ? in front of them)
  100. procedure LongVowelLength
  101. // "guldmine" [ul/3] makes the vowel extremely short
  102. IF prevVowel(u) AND prev2PhW(l/3) THEN
  103. length 350
  104. RETURN
  105. ENDIF
  106. // "guldur" [ul/3] makes the vowel extremely short
  107. IF prevVowel(u) AND prevPhW(l/3) THEN
  108. IF NOT thisPh(isWordEnd) THEN // NOT "umulig"
  109. length 325
  110. RETURN
  111. ENDIF
  112. ENDIF
  113. // "alene" - Short initial vowel sounds too short at length 140
  114. IF thisPh(isWordStart) THEN
  115. length 160
  116. // "ønske" The vowel should have been made short becauce og 2 x consonant.
  117. // Take care of it here
  118. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) AND next3PhW(isNotVowel) THEN
  119. length 140
  120. ENDIF
  121. // "ære"
  122. IF nextPhW(V) AND nextPhW(isFinalVowel) THEN
  123. length 240
  124. ENDIF
  125. RETURN
  126. ENDIF
  127. // "huske" - hACC@- vowel too long
  128. IF prevPhW(h) AND nextPhW(isNotVowel) AND next2PhW(isNotVowel) AND next3PhW(@-) THEN
  129. length 110
  130. RETURN
  131. ENDIF
  132. // PB long vowel followed by [@-] or [V](vowel+vowel) - "pigen" [p'i@-n]
  133. IF nextPhW(@-) OR nextPhW(V) THEN
  134. length 225
  135. ENDIF
  136. // PB "enig", "enige", "evig", "stædig" - vowel+consolant+[i]
  137. IF nextPhW(isNotVowel) AND next2PhW(i) THEN
  138. length 225
  139. ENDIF
  140. // "dele", "mene", "møve"
  141. IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(3) OR next3PhW(@-) THEN
  142. length 225
  143. ENDIF
  144. // "sveder", "deler"
  145. IF nextPhW(isNotVowel) AND next2PhW(V) THEN
  146. length 225
  147. ENDIF
  148. // "maskinen" consonant + [@-n]: vowel too long
  149. IF nextPhW(isNotVowel) AND next2PhW(@-) AND next3PhW(n) THEN
  150. length 160
  151. ENDIF
  152. // "vilje", "nedladende" [n'eDl&D@-n@-], "delte" - short followed by 2 consonants
  153. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  154. // Don't make "møve" [m'Ww_!@-_!] short
  155. IF NOT next2PhW(_!) THEN
  156. length 140
  157. ENDIF
  158. ENDIF
  159. // "bryde", "bryder", "strålen", "henrivende" R makes the vowel too long
  160. IF prevPhW(R) OR prevPhW(3-) OR prevPhW(r) THEN
  161. IF NOT thisPh(V) AND next2PhW(@-) OR next2PhW(V) THEN
  162. length 140
  163. ENDIF
  164. ENDIF
  165. // "føden"
  166. IF nextPhW(D) AND next2PhW(@-) AND next3PhW(n) THEN
  167. length 180
  168. ENDIF
  169. // "glimrende", "glemte" [l/3] makes the following vowel too long
  170. // LengthAdd doesn't work here. The length could be 225 or 140 - 30
  171. IF prev2PhW(g) AND prevPhW(l/3) AND nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  172. length 110
  173. RETURN
  174. ENDIF
  175. // l/3 makes the vowel too long (+ voiced?)
  176. // isVoiced = b, d, g, v, z
  177. IF prevPhW(l/3) AND nextPhW(isVoiced) THEN
  178. // "klub", "klud"
  179. // The vowel should have been short but we fix it here
  180. IF NOT next2PhW(@-) AND NOT next2PhW(V) THEN
  181. length 100
  182. ELSE
  183. // "slæde", "lader"
  184. length 160
  185. ENDIF
  186. ENDIF
  187. // "længe" - short - 2 consonants => 1 consonant (ng => [N])
  188. IF nextPhW(isNasal) THEN
  189. IF NOT prevPhW(R) AND NOT prevPhW(r) AND NOT prevPhW(3-) THEN
  190. length 140
  191. // "omkring", "ring" - both prev. N and next R
  192. ELIF prevPhW(R) OR prevPhW(r) OR prevPhW(3-) THEN
  193. length 110
  194. ENDIF
  195. ENDIF
  196. // "buskene", "krøbling" The vowel should have been made short becauce og 2 x consonant.
  197. // Take care of it here
  198. IF nextPhW(isNotVowel) AND next2PhW(isNotVowel) THEN
  199. IF NOT nextPhW(l/3) THEN
  200. IF NOT nextPhW(r) AND NOT prevPhW(R) AND NOT prevPhW(3-) THEN // NOT "Maria"
  201. length 110
  202. ENDIF
  203. ENDIF
  204. ENDIF
  205. // "barnet" - consonant + [@-D]: too long vowel
  206. IF nextPhW(isNotVowel) AND next2PhW(@-) AND next3PhW(D) THEN
  207. length 160
  208. ENDIF
  209. // "trin", "trit", "ring" - vowel too long
  210. // IF prevPhW(isRhotic) THEN
  211. IF prevPhW(R) OR prevPhW(r) OR prevPhW(3-) THEN
  212. IF nextPhW(isNotVowel) AND nextPhW(isWordEnd) THEN
  213. length 110
  214. ENDIF
  215. ENDIF
  216. endprocedure
  217. // A bit longer than [@-]
  218. phoneme @
  219. vowel starttype #@ endtype #@
  220. unstressed
  221. length 60
  222. FMT(vowel/@_3)
  223. endphoneme
  224. phoneme @- // very short schwa
  225. vowel starttype #@ endtype #@
  226. unstressed nonsyllabic
  227. ipa ə
  228. IF nextPhW(*) OR nextPhW(r) THEN
  229. ipa NULL // @-* is used to make 'r'
  230. ENDIF
  231. length 50
  232. // "femten", "manden" - only a short "n" sound
  233. IF nextPhW(n) THEN
  234. length 15
  235. ENDIF
  236. IF prevPhW(isNotVowel) AND thisPh(isWordEnd) THEN
  237. length 15
  238. ENDIF
  239. // "lige" [li@-]
  240. IF prevPhW(i) AND thisPh(isWordEnd) THEN
  241. length 15
  242. ENDIF
  243. FMT(vowel/@-)
  244. endphoneme
  245. // ToDo: change [@] to [a#] if adjacent to [r] or [R]
  246. phoneme 3
  247. vowel starttype #a endtype #a
  248. unstressed
  249. length 40
  250. FMT(vowel/a#_3)
  251. endphoneme
  252. // PB sort of schwa [ɐ] (0250+032F)
  253. // "spurgt" [sp'o3-d] – ipa [spˈoɐ̯d]
  254. phoneme 3- // used for 'r' after a vowel (to create a diphthong)
  255. liquid
  256. lengthmod 7
  257. ipa ɐ̯
  258. FMT(r/a_)
  259. endphoneme
  260. phoneme i
  261. vowel starttype #i endtype #i
  262. length 140
  263. CALL LongVowelLength
  264. FMT(vowel/i_4)
  265. endphoneme
  266. // PB short i
  267. // sviret vs. svirret
  268. phoneme ?i
  269. vowel starttype #i endtype #i
  270. length 140
  271. CALL ShortVowelLength
  272. IfNextVowelAppend(;)
  273. FMT(vowel/i_4)
  274. endphoneme
  275. // PB English i - Tim
  276. phoneme I
  277. vowel starttype #i endtype #i
  278. length 130
  279. IfNextVowelAppend(;)
  280. FMT(vowel/ii_2)
  281. endphoneme
  282. phoneme e
  283. vowel starttype #e endtype #e
  284. length 140
  285. CALL LongVowelLength
  286. // CALL ShortVowelLength
  287. FMT(vowel/e)
  288. endphoneme
  289. // PB short e
  290. // "skille" vs. "skele", "pille" vs. "pile"
  291. phoneme ?e
  292. vowel starttype #e endtype #e
  293. length 140
  294. CALL ShortVowelLength
  295. FMT(vowel/e)
  296. endphoneme
  297. phoneme E
  298. vowel starttype #e endtype #e
  299. length 140
  300. // no link with next vowel
  301. IF thisPh(isWordEnd) THEN
  302. IfNextVowelAppend(_!)
  303. ENDIF
  304. // "ære", "kærester", "ærefrygt" - vowel + vowel
  305. IF nextPhW(V) THEN
  306. length 225
  307. ENDIF
  308. // "dræber" TEST shortened by -70 in procedure because of the "r" sound
  309. IF prevPhW(R) OR prevPhW(r) OR prevPhW(3-) AND next2PhW(V) THEN
  310. length 225
  311. ENDIF
  312. CALL LongVowelLength
  313. // "værelse" [v'E3-Vls@_!]
  314. IF nextPhW(3-) AND next2PhW(V) THEN
  315. length 100
  316. ENDIF
  317. FMT(vowel/e_mid2)
  318. endphoneme
  319. // PB short E
  320. // "læsse" vs. "læse"
  321. phoneme ?E
  322. vowel starttype #e endtype #e
  323. ipa ε
  324. length 140
  325. CALL ShortVowelLength
  326. FMT(vowel/e_mid2)
  327. endphoneme
  328. phoneme &
  329. vowel starttype #e endtype #e
  330. ipa a
  331. length 140
  332. // "same", "sale", "bade" - consonant + @-: long
  333. // but NOT "hinanden"
  334. IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(@) THEN
  335. IF NOT next3PhW(n) THEN
  336. length 225
  337. ENDIF
  338. ENDIF
  339. // ThisPh + V or @-
  340. // "ae", "aer" vowel + vowel: extra length
  341. IF nextPhW(@-) OR nextPhW(V) THEN
  342. length 260
  343. ENDIF
  344. CALL LongVowelLength
  345. FMT(vowel/ee_2)
  346. endphoneme
  347. // Short &
  348. // e.g. the last a in "staldkarl"
  349. // "sale" vs. "sal"
  350. phoneme ?&
  351. ipa a
  352. vowel starttype #e endtype #e
  353. length 140
  354. CALL ShortVowelLength
  355. FMT(vowel/ee_2)
  356. endphoneme
  357. // Added for the æ in "dræbt"
  358. phoneme &#
  359. vowel starttype #e endtype #e
  360. length 140
  361. ipa a
  362. CALL LongVowelLength
  363. // CALL ShortVowelLength
  364. FMT(vowel/&)
  365. endphoneme
  366. // PB short &#
  367. // "revl" vs. "tremme"
  368. phoneme ?&#
  369. vowel starttype #e endtype #e
  370. ipa ?a
  371. length 140
  372. CALL ShortVowelLength
  373. FMT(vowel/&)
  374. endphoneme
  375. phoneme A // PB changed to a_8
  376. vowel starttype #a endtype #a
  377. length 140
  378. CALL LongVowelLength
  379. // "fare" [f'A:A]
  380. IF nextPhW(A) THEN
  381. length 225
  382. ENDIF
  383. FMT(vowel/a_8)
  384. endphoneme
  385. // PB short A
  386. // "krabbe" vs. "drabelig"
  387. phoneme ?A
  388. vowel starttype #a endtype #a
  389. length 140
  390. CALL ShortVowelLength
  391. FMT(vowel/a_8)
  392. endphoneme
  393. phoneme u
  394. vowel starttype #u endtype #u
  395. length 140
  396. // "suge", "uge", "bluse", "julegave"
  397. IF nextPhW(@-) OR nextPhW(V) OR next2PhW(@-) OR next2PhW(V)THEN
  398. length 225
  399. ENDIF
  400. CALL LongVowelLength
  401. FMT(vowel/u_bck)
  402. endphoneme
  403. // Short u
  404. // "tude" vs. "tuden" - [tuD3] [t?uD@n]
  405. phoneme ?u
  406. vowel starttype #u endtype #u
  407. length 140
  408. CALL ShortVowelLength
  409. FMT(vowel/u_bck)
  410. endphoneme
  411. phoneme o
  412. vowel starttype #o endtype #o
  413. length 140
  414. // "bore", "borer" [boV] o + V
  415. IF nextPhW(V) OR nextPhW(@-) THEN
  416. length 225
  417. ENDIF
  418. // "kone", "koner" o + consonant + V or @-
  419. IF next2PhW(V) OR next2PhW(@-) THEN
  420. length 225
  421. ENDIF
  422. CALL LongVowelLength
  423. FMT(vowel/o_2)
  424. endphoneme
  425. // PB Short o
  426. // "patron" vs. "kone"
  427. phoneme ?o
  428. vowel starttype #o endtype #o
  429. length 140
  430. FMT(vowel/o_2)
  431. endphoneme
  432. phoneme O
  433. vowel starttype #o endtype #o
  434. length 140
  435. ipa ɒ // changed from ɔ - Den Danske Ordbog: ɒ
  436. // "sove", "sover" - consonant + @ or V: long
  437. IF next2PhW(@-) OR next2PhW(V) THEN
  438. // length 225
  439. ENDIF
  440. // PB "gået" - ThisPh + V or @-
  441. IF nextPhW(V) OR nextPhW(@-) THEN
  442. // length 225
  443. ENDIF
  444. // "såre", "sårede" [s'O:?OD@-]
  445. IF nextPhW(O) OR nextPhW(?O) THEN
  446. length 225
  447. ENDIF
  448. CALL LongVowelLength
  449. FMT(vowel/o_5)
  450. endphoneme
  451. // Short O
  452. // "toget" vs. "tåget"
  453. phoneme ?O
  454. vowel starttype #o endtype #o
  455. length 140
  456. CALL ShortVowelLength
  457. FMT(vowel/o_5)
  458. endphoneme
  459. phoneme V
  460. vowel starttype #@ endtype #@
  461. length 140
  462. CALL LongVowelLength
  463. FMT(vowel/V_4)
  464. endphoneme
  465. // PB Short V
  466. // "forstår" vs. "kåre"
  467. phoneme ?V
  468. vowel starttype #@ endtype #@
  469. length 140
  470. CALL ShortVowelLength
  471. FMT(vowel/V_4)
  472. endphoneme
  473. phoneme 0
  474. vowel starttype #o endtype #o
  475. length 140
  476. ipa ɔ
  477. FMT(vowel/oo_2)
  478. endphoneme
  479. // Short 0 "sukker", "provst"
  480. phoneme ?0
  481. vowel starttype #o endtype #o
  482. length 140
  483. ipa ɔ
  484. CALL ShortVowelLength
  485. FMT(vowel/oo_2)
  486. endphoneme
  487. phoneme y
  488. vowel starttype #i endtype #i
  489. length 140
  490. CALL LongVowelLength
  491. FMT(vowel/y)
  492. endphoneme
  493. // PB Short y
  494. // "kylling" vs. "kyle", "krybbe" vs. "krybe"
  495. phoneme ?y
  496. vowel starttype #i endtype #i
  497. length 140
  498. CALL ShortVowelLength
  499. FMT(vowel/y)
  500. endphoneme
  501. phoneme Y
  502. vowel starttype #i endtype #i
  503. length 140
  504. IF nextPhW(V) OR nextPhW(@-) THEN
  505. length 225
  506. ENDIF
  507. FMT(vowel/yy)
  508. endphoneme
  509. phoneme W
  510. vowel starttype #@ endtype #@
  511. length 140
  512. CALL LongVowelLength
  513. FMT(vowel/oe)
  514. endphoneme
  515. // Short W
  516. // "prøv" vs. "prøve"
  517. phoneme ?W
  518. vowel starttype #@ endtype #@
  519. length 140
  520. CALL ShortVowelLength
  521. FMT(vowel/oe)
  522. endphoneme
  523. // Added for the ø in "røv", "røg", "øje" instead of [V3]
  524. phoneme W#
  525. vowel starttype #@ endtype #@
  526. length 140
  527. CALL LongVowelLength
  528. FMT(vowel/V)
  529. endphoneme
  530. // Short W#
  531. // "rømme"
  532. phoneme ?W#
  533. vowel starttype #@ endtype #@
  534. length 140
  535. CALL ShortVowelLength
  536. FMT(vowel/V)
  537. endphoneme
  538. phoneme aI
  539. vowel starttype #a endtype #i
  540. length 300
  541. IF NOT next2Ph(3) AND NOT next2Ph(V) AND NOT next2Ph(@-) AND nextPhW(isNotVowel) THEN
  542. glstop
  543. length 225
  544. ENDIF
  545. // "dreje" [dR'aI@-_!]
  546. IF nextPhW(3) OR nextPhW(V) OR nextPhW(@) OR nextPhW(@-) THEN
  547. length 280
  548. ENDIF
  549. // PB "drej" vs. "dreje"
  550. IF thisPh(isWordEnd) THEN
  551. length 140
  552. ENDIF
  553. // "lejde" [l'aId@-_!], "lejder" [l'aIdV_!]
  554. IF nextPhW(isNotVowel) AND next2PhW(@-) OR next2PhW(V) THEN
  555. length 190
  556. ENDIF
  557. FMT(vdiph/ai)
  558. endphoneme
  559. // CONSONANTS
  560. // PB added l/3
  561. phoneme l
  562. liquid
  563. lengthmod 7
  564. // [ll] => [-l] - avoid double l
  565. IF nextPhW(l) THEN
  566. // ChangePhoneme(NULL)
  567. ENDIF
  568. ChangePhoneme(l/3)
  569. // CALL base/l
  570. endphoneme
  571. phoneme l/3 // Replacement for [l/]
  572. liquid
  573. lengthmod 7
  574. FMT(l/l_)
  575. endphoneme
  576. phoneme v // approximant, not fricative
  577. import_phoneme base/v#
  578. voicingswitch f
  579. endphoneme
  580. // PB Actually a kind of schwa = [ɐ]? - "byder" [bˈyðɐʌ]
  581. phoneme r // used for 'r' after a vowel (to create a diphthong)
  582. liquid
  583. lengthmod 7
  584. ipa ɐ̯
  585. IF nextPhW(isVowel) AND NOT nextPhW(?V) AND NOT nextPhW(V) AND NOT nextPhW(@-) THEN
  586. ChangePhoneme(R)
  587. ENDIF
  588. // "generer" [Sen'e:Vr], "mysterier" - delete the r
  589. IF prevPhW(V) AND thisPh(isWordEnd) THEN
  590. ChangePhoneme(NULL)
  591. ENDIF
  592. FMT(r/a_)
  593. endphoneme
  594. phoneme R
  595. lengthmod 6
  596. liquid
  597. ipa ʁ
  598. FMT(r/aa)
  599. endphoneme
  600. // don't weaken consonants at end of word or before a stop
  601. phoneme s
  602. vls alv frc sibilant
  603. voicingswitch z
  604. lengthmod 3
  605. Vowelin f1=0 f2=1700 -300 300 f3=-100 80
  606. Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
  607. IF nextPh(p) OR nextPh(t) OR nextPh(k) THEN
  608. WAV(ufric/s!)
  609. ENDIF
  610. WAV(ufric/s)
  611. endphoneme
  612. phoneme p
  613. vls blb stop
  614. voicingswitch b
  615. lengthmod 7
  616. Vowelin f1=0 f2=1000 -50 -100 f3=-200 80 amp=11
  617. Vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=22
  618. IF nextPh(isPause2) THEN
  619. WAV(ustop/p_unasp)
  620. ELIF nextPh(r) THEN
  621. WAV(ustop/pr, 70)
  622. ELIF nextPh(R) OR nextPh(R2) THEN
  623. WAV(ustop/pr)
  624. ELIF nextPh(@-) THEN
  625. WAV(ustop/p_unasp)
  626. ELIF nextPh(l) THEN
  627. WAV(ustop/pl)
  628. ENDIF
  629. WAV(ustop/p)
  630. endphoneme
  631. phoneme t
  632. vls alv stop
  633. voicingswitch d
  634. lengthmod 7
  635. Vowelin f1=0 f2=1700 -300 300 f3=-100 80
  636. Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
  637. IF nextPh(r) OR nextPh(R) OR nextPh(R2) THEN
  638. WAV(ustop/tr)
  639. ENDIF
  640. // "respekt" [REsp'Egd]
  641. IF thisPh(isWordEnd) THEN
  642. // ChangePhoneme(d)
  643. ENDIF
  644. WAV(ustop/t, 90)
  645. endphoneme
  646. phoneme j
  647. liquid palatal
  648. lengthmod 7
  649. // no link with next vowel
  650. IF thisPh(isWordEnd) THEN
  651. IfNextVowelAppend(_!)
  652. ENDIF
  653. IF nextPhW(isVowel) THEN
  654. NextVowelStarts
  655. VowelStart(j/j@,-45) // jøderne
  656. VowelStart(j/ja)
  657. VowelStart(j/je,-35)
  658. VowelStart(j/ji)
  659. VowelStart(j/jo,-65) // "kjole"
  660. VowelStart(j/ju)
  661. EndSwitch
  662. Vowelout len=70
  663. VowelEnding(j/xj, -30)
  664. IF prevPh(isPause) THEN
  665. FMT(j/_j)
  666. ENDIF
  667. ELSE
  668. // no vowel follows
  669. Vowelout len=70
  670. FMT(j/j_)
  671. ENDIF
  672. endphoneme