Files
espeak-ng/python_test.py
2023-09-07 13:26:58 -05:00

100 lines
3.2 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()