mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-10-31 13:38:47 +00:00
100 lines
3.2 KiB
Python
Executable File
100 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""Verifies that the custom espeak_TextToPhonemesWithTerminator function works."""
|
||
import ctypes
|
||
|
||
EE_OK = 0
|
||
AUDIO_OUTPUT_SYNCHRONOUS = 0x02
|
||
espeakPHONEMES_IPA = 0x02
|
||
espeakCHARS_AUTO = 0
|
||
|
||
CLAUSE_INTONATION_FULL_STOP = 0x00000000
|
||
CLAUSE_INTONATION_COMMA = 0x00001000
|
||
CLAUSE_INTONATION_QUESTION = 0x00002000
|
||
CLAUSE_INTONATION_EXCLAMATION = 0x00003000
|
||
CLAUSE_INTONATION_NONE = 0x00004000
|
||
|
||
CLAUSE_TYPE_NONE = 0x00000000
|
||
CLAUSE_TYPE_EOF = 0x00010000
|
||
CLAUSE_TYPE_CLAUSE = 0x00040000
|
||
CLAUSE_TYPE_SENTENCE = 0x00080000
|
||
|
||
CLAUSE_NONE = 0 | CLAUSE_INTONATION_NONE | CLAUSE_TYPE_NONE
|
||
CLAUSE_PARAGRAPH = 70 | CLAUSE_INTONATION_FULL_STOP | CLAUSE_TYPE_SENTENCE
|
||
CLAUSE_EOF = 40 | CLAUSE_INTONATION_FULL_STOP | CLAUSE_TYPE_SENTENCE | CLAUSE_TYPE_EOF
|
||
CLAUSE_PERIOD = 40 | CLAUSE_INTONATION_FULL_STOP | CLAUSE_TYPE_SENTENCE
|
||
CLAUSE_COMMA = 20 | CLAUSE_INTONATION_COMMA | CLAUSE_TYPE_CLAUSE
|
||
CLAUSE_QUESTION = 40 | CLAUSE_INTONATION_QUESTION | CLAUSE_TYPE_SENTENCE
|
||
CLAUSE_EXCLAMATION = 45 | CLAUSE_INTONATION_EXCLAMATION | CLAUSE_TYPE_SENTENCE
|
||
CLAUSE_COLON = 30 | CLAUSE_INTONATION_FULL_STOP | CLAUSE_TYPE_CLAUSE
|
||
CLAUSE_SEMICOLON = 30 | CLAUSE_INTONATION_COMMA | CLAUSE_TYPE_CLAUSE
|
||
|
||
EXPECTED_PHONEMES = """ðˈɪs, ˌaɪˌɛsˈeɪ; ɡˈʊd: tˈɛst!
|
||
ˌoʊkˈeɪ?
|
||
"""
|
||
|
||
|
||
def main() -> None:
|
||
"""Verify espeak_TextToPhonemesWithTerminator function"""
|
||
lib = ctypes.cdll.LoadLibrary("libespeak-ng.so")
|
||
ret = lib.espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 0, None, 0)
|
||
assert ret > 0, ret
|
||
|
||
# Set voice
|
||
voice = "en-us"
|
||
voice_bytes = voice.encode("utf-8")
|
||
ret = lib.espeak_SetVoiceByName(voice_bytes)
|
||
assert ret == EE_OK, ret
|
||
|
||
# Will fail if custom function is missing
|
||
lib.espeak_TextToPhonemesWithTerminator.restype = ctypes.c_char_p
|
||
|
||
# Should split into 3 sentences, highlighting each punctuation type.
|
||
text = "this, I.S. a; good: test! ok?"
|
||
text_bytes = text.encode("utf-8")
|
||
text_pointer = ctypes.c_char_p(text_bytes)
|
||
|
||
phoneme_flags = espeakPHONEMES_IPA
|
||
text_flags = espeakCHARS_AUTO
|
||
|
||
phonemes = ""
|
||
while text_pointer:
|
||
terminator = ctypes.c_int(0)
|
||
clause_phonemes = lib.espeak_TextToPhonemesWithTerminator(
|
||
ctypes.pointer(text_pointer),
|
||
text_flags,
|
||
phoneme_flags,
|
||
ctypes.pointer(terminator),
|
||
)
|
||
if isinstance(clause_phonemes, bytes):
|
||
phonemes += clause_phonemes.decode()
|
||
|
||
# Check for punctuation.
|
||
if terminator.value == CLAUSE_EXCLAMATION:
|
||
phonemes += "!"
|
||
elif terminator.value == CLAUSE_QUESTION:
|
||
phonemes += "?"
|
||
elif terminator.value == CLAUSE_COMMA:
|
||
phonemes += ","
|
||
elif terminator.value == CLAUSE_COLON:
|
||
phonemes += ":"
|
||
elif terminator.value == CLAUSE_SEMICOLON:
|
||
phonemes += ";"
|
||
elif terminator.value == CLAUSE_PERIOD:
|
||
phonemes += "."
|
||
|
||
# Check for end of sentence
|
||
if (terminator.value & CLAUSE_TYPE_SENTENCE) == CLAUSE_TYPE_SENTENCE:
|
||
phonemes += "\n"
|
||
else:
|
||
phonemes += " "
|
||
|
||
assert (
|
||
phonemes == EXPECTED_PHONEMES
|
||
), f"Expected: {EXPECTED_PHONEMES}\n Got: {phonemes}"
|
||
|
||
print("It works!")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|