38 行
1.3 KiB
Python
38 行
1.3 KiB
Python
import subprocess
|
|
from ctypes import ARRAY # type: ignore
|
|
from ctypes import POINTER, byref, c_int, c_ubyte, cast, cdll
|
|
|
|
|
|
class Aques:
|
|
@classmethod
|
|
def main (cls, text: str, goatoh_mode: bool = False) -> bytearray | None:
|
|
return cls.__synthe_utf8 (text, 100, './phont/ar_m5.phont' if goatoh_mode else './phont/ar_mf2.phont')
|
|
|
|
@staticmethod
|
|
def __synthe_utf8 (text, speed, phont_file = None) -> bytearray | None:
|
|
if phont_file is None:
|
|
phont = None
|
|
else:
|
|
with open (phont_file, 'rb') as f:
|
|
phont = f.read ()
|
|
|
|
p = subprocess.Popen ('./aques', stdin = subprocess.PIPE,
|
|
stdout = subprocess.PIPE)
|
|
koe: str = p.communicate (text.encode ())[0].decode ()
|
|
|
|
aqtk = cdll.LoadLibrary ('libAquesTalk2Eva.so')
|
|
aqtk.AquesTalk2_Synthe_Utf8.restype = POINTER (ARRAY (c_ubyte, 0))
|
|
size = c_int (0)
|
|
wav_p = aqtk.AquesTalk2_Synthe_Utf8 (koe.encode ('utf-8'), speed,
|
|
byref (size), phont)
|
|
|
|
if not bool (wav_p):
|
|
return None
|
|
|
|
wav_p = cast (wav_p, POINTER (ARRAY (c_ubyte, size.value)))
|
|
wav = bytearray (wav_p.contents)
|
|
aqtk.AquesTalk2_FreeWave (wav_p)
|
|
|
|
return wav
|
|
|