|
| 1 | +# SPDX-FileCopyrightText: 2016-2026 PyThaiNLP Project |
| 2 | +# SPDX-FileType: SOURCE |
| 3 | +# SPDX-License-Identifier: Apache-2.0 |
| 4 | +import re |
| 5 | + |
| 6 | + |
| 7 | +def pronunciate_pali(word: str) -> str: |
| 8 | + """ |
| 9 | + Convert pali word to Thai pronunciation |
| 10 | +
|
| 11 | + :param str word: Pali word (written in Thai script) to be pronunciated. |
| 12 | +
|
| 13 | + :return: A string of Thai letters indicating |
| 14 | + how the input text should be pronounced. |
| 15 | +
|
| 16 | + :Example: |
| 17 | +
|
| 18 | + >>> from pythainlp.transliterate import pronunciate_pali |
| 19 | + >>> pronunciate_pali('ภควา') |
| 20 | + 'ภะคะวา' |
| 21 | + >>> pronunciate_pali('สมฺมา') |
| 22 | + 'สัมมา' |
| 23 | + >>> pronunciate_pali('มยํ') |
| 24 | + 'มะยัง' |
| 25 | + >>> pronunciate_pali('สฺวากฺขา') |
| 26 | + 'สวากขาโต' |
| 27 | +
|
| 28 | + """ |
| 29 | + # 1. จัดการช่องว่างที่อาจพิมพ์เกินมาก่อนนฤคหิต |
| 30 | + word = word.replace(" ํ", "ํ").replace("ฺ ", "ฺ") |
| 31 | + |
| 32 | + # --- กฎข้อ 3: นฤคหิต (ํ) --- |
| 33 | + # แบบมีสระหน้า (เ-ไ) เช่น โกํ -> โกง |
| 34 | + word = re.sub(r'([เ-ไ][ก-ฮ])ํ', r'\1ง_F_', word) |
| 35 | + # แบบมีสระบน/ล่าง (ะ-ู) เช่น สุ ํ -> สุง |
| 36 | + word = re.sub(r'([ก-ฮ][ะ-ู])ํ', r'\1ง_F_', word) |
| 37 | + # แบบพยัญชนะเดี่ยว เช่น หํ -> หัง |
| 38 | + word = re.sub(r'([ก-ฮ])ํ', r'\1ัง_F_', word) |
| 39 | + |
| 40 | + # --- กฎข้อ 4 & 5: พินทุ (ฺ) เป็นตัวควบกล้ำ (ต้นคำ) --- |
| 41 | + # ถ้าพินทุอยู่พยัญชนะตัวแรกของคำ (ไม่มีตัวอื่นนำหน้า) ให้มาร์คเป็นตัวควบกล้ำ (_C_) |
| 42 | + word = re.sub(r'(^|\s)([ก-ฮ])ฺ', r'\1\2_C_', word) |
| 43 | + |
| 44 | + # --- กฎข้อ 2: พินทุ (ฺ) เป็นตัวสะกด --- |
| 45 | + # แบบมีสระนำหน้า เช่น เนยฺ -> เนย |
| 46 | + word = re.sub(r'([เ-ไ][ก-ฮ])([ก-ฮ])ฺ', r'\1\2_F_', word) |
| 47 | + # แบบมีสระบน/ล่าง เช่น ทิฏฺ -> ทิฏ |
| 48 | + word = re.sub(r'([ก-ฮ][ะ-ู])([ก-ฮ])ฺ', r'\1\2_F_', word) |
| 49 | + # แบบพยัญชนะเดี่ยว (สะกด) เช่น สมฺ -> สัม (เพิ่มไม้หันอากาศ) |
| 50 | + word = re.sub(r'([ก-ฮ])([ก-ฮ])ฺ', r'\1ั\2_F_', word) |
| 51 | + |
| 52 | + # --- กฎข้อ 1: พยัญชนะที่ไม่มีเครื่องหมาย ให้อ่านเสียง "อะ" --- |
| 53 | + # หาพยัญชนะที่: ไม่ได้ตามหลัง เ-ไ และ ไม่ได้นำหน้าสระ, ไม่ใช่ตัวสะกด(_F_), ไม่ใช่ตัวควบ(_C_) |
| 54 | + word = re.sub(r'(?<![เ-ไ])([ก-ฮ])(?![ะ-ู็-์]|_F_|_C_)', r'\1ะ', word) |
| 55 | + |
| 56 | + # ทำความสะอาด Marker ที่เราใช้ทดไว้ตอนประมวลผล (_F_ = Final, _C_ = Cluster) |
| 57 | + word = word.replace('_F_', '').replace('_C_', '') |
| 58 | + |
| 59 | + return word |
0 commit comments