mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Start wrapping espeak
This commit is contained in:
parent
1737ea5c8a
commit
c027aaff75
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -45,7 +45,7 @@ jobs:
|
|||||||
# set -xe
|
# set -xe
|
||||||
# useradd -m ci
|
# useradd -m ci
|
||||||
# pacman -Syu --noconfirm
|
# pacman -Syu --noconfirm
|
||||||
# pacman -S --noconfirm --needed base-devel sudo git sip chmlib icu jxrlib hunspell libmtp libusbx libwmf optipng podofo python-apsw python-beautifulsoup4 python-cssselect python-css-parser python-dateutil python-dbus python-dnspython python-dukpy python-feedparser python-html2text python-html5-parser python-lxml python-markdown python-mechanize python-msgpack python-netifaces python-unrardll python-pillow python-psutil python-pygments python-pyqt5 python-regex python-zeroconf python-pyqtwebengine qt5-x11extras qt5-svg qt5-imageformats udisks2 hyphen python-pychm
|
# pacman -S --noconfirm --needed base-devel sudo git sip chmlib icu jxrlib hunspell libmtp libusbx libwmf optipng podofo python-apsw python-beautifulsoup4 python-cssselect python-css-parser python-dateutil python-dbus python-dnspython python-dukpy python-feedparser python-html2text python-html5-parser python-lxml python-markdown python-mechanize python-msgpack python-netifaces python-unrardll python-pillow python-psutil python-pygments python-pyqt5 python-regex python-zeroconf python-pyqtwebengine qt5-x11extras qt5-svg qt5-imageformats udisks2 hyphen python-pychm espeak-ng
|
||||||
#
|
#
|
||||||
# - name: Checkout source code
|
# - name: Checkout source code
|
||||||
# uses: actions/checkout@master
|
# uses: actions/checkout@master
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
image 'https://partner-images.canonical.com/core/xenial/current/ubuntu-xenial-core-cloudimg-{}-root.tar.gz'
|
image 'https://partner-images.canonical.com/core/xenial/current/ubuntu-xenial-core-cloudimg-{}-root.tar.gz'
|
||||||
|
|
||||||
# Build time deps for Qt. See http://doc.qt.io/qt-5/linux-requirements.html and https://wiki.qt.io/Building_Qt_5_from_Git
|
# Build time deps for Qt. See http://doc.qt.io/qt-5/linux-requirements.html and https://wiki.qt.io/Building_Qt_5_from_Git
|
||||||
deps 'flex bison gperf ruby libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-xinerama0-dev xkb-data libglu1-mesa-dev libxkbcommon-dev libinput-dev libxkbcommon-x11-dev libgtk2.0-dev libvulkan-dev libwayland-dev libwayland-egl1-mesa libegl1-mesa-dev libxtst-dev libnss3-dev libfreetype6-dev libfontconfig-dev'
|
deps 'flex bison gperf ruby libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-xinerama0-dev xkb-data libglu1-mesa-dev libxkbcommon-dev libinput-dev libxkbcommon-x11-dev libgtk2.0-dev libvulkan-dev libwayland-dev libwayland-egl1-mesa libegl1-mesa-dev libxtst-dev libnss3-dev libfreetype6-dev libfontconfig-dev libespeak-ng-dev'
|
||||||
|
@ -179,6 +179,12 @@
|
|||||||
"sources": "calibre/utils/cocoa.m calibre/utils/cocoa_wrapper.c",
|
"sources": "calibre/utils/cocoa.m calibre/utils/cocoa_wrapper.c",
|
||||||
"ldflags": "-framework Cocoa"
|
"ldflags": "-framework Cocoa"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "espeak",
|
||||||
|
"only": "linux haiku",
|
||||||
|
"sources": "calibre/utils/tts/espeak.cpp",
|
||||||
|
"libraries": "espeak-ng"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "libusb",
|
"name": "libusb",
|
||||||
"only": "macos linux haiku",
|
"only": "macos linux haiku",
|
||||||
|
@ -111,7 +111,7 @@ def run_python(*args):
|
|||||||
def install_linux_deps():
|
def install_linux_deps():
|
||||||
run('sudo', 'apt-get', 'update', '-y')
|
run('sudo', 'apt-get', 'update', '-y')
|
||||||
# run('sudo', 'apt-get', 'upgrade', '-y')
|
# run('sudo', 'apt-get', 'upgrade', '-y')
|
||||||
run('sudo', 'apt-get', 'install', '-y', 'gettext', 'libgl1-mesa-dev')
|
run('sudo', 'apt-get', 'install', '-y', 'gettext', 'libgl1-mesa-dev', 'libespeak-ng-dev')
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -253,7 +253,7 @@ class ExtensionsImporter:
|
|||||||
elif ismacos:
|
elif ismacos:
|
||||||
extra = ('usbobserver', 'cocoa', 'libusb', 'libmtp')
|
extra = ('usbobserver', 'cocoa', 'libusb', 'libmtp')
|
||||||
elif isfreebsd or ishaiku or islinux:
|
elif isfreebsd or ishaiku or islinux:
|
||||||
extra = ('libusb', 'libmtp')
|
extra = ('libusb', 'libmtp', 'espeak')
|
||||||
else:
|
else:
|
||||||
extra = ()
|
extra = ()
|
||||||
self.calibre_extensions = frozenset(extensions + extra)
|
self.calibre_extensions = frozenset(extensions + extra)
|
||||||
|
0
src/calibre/utils/tts/__init__.py
Normal file
0
src/calibre/utils/tts/__init__.py
Normal file
56
src/calibre/utils/tts/espeak.cpp
Normal file
56
src/calibre/utils/tts/espeak.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* espeak.cpp
|
||||||
|
* Copyright (C) 2020 Kovid Goyal <kovid at kovidgoyal.net>
|
||||||
|
*
|
||||||
|
* Distributed under terms of the GPL3 license.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define PY_SSIZE_T_CLEAN
|
||||||
|
#define UNICODE
|
||||||
|
#define _UNICODE
|
||||||
|
#include <Python.h>
|
||||||
|
#include <espeak-ng/speak_lib.h>
|
||||||
|
|
||||||
|
static bool initialize_called = false;
|
||||||
|
|
||||||
|
// Boilerplate {{{
|
||||||
|
#define M(name, args) { #name, (PyCFunction)name, args, ""}
|
||||||
|
static PyMethodDef methods[] = {
|
||||||
|
{NULL, NULL, 0, NULL}
|
||||||
|
};
|
||||||
|
#undef M
|
||||||
|
|
||||||
|
static int
|
||||||
|
exec_module(PyObject *m) {
|
||||||
|
#define AI(name) if (PyModule_AddIntMacro(m, name) != 0) { return -1; }
|
||||||
|
#undef AI
|
||||||
|
int sample_rate = espeak_Initialize(AUDIO_OUTPUT_SYNCH_PLAYBACK, 0, NULL, espeakINITIALIZE_DONT_EXIT);
|
||||||
|
if (sample_rate == -1) {
|
||||||
|
PyErr_SetString(PyExc_OSError, "Failed to initialize espeak library, are the data files missing?");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
initialize_called = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyModuleDef_Slot slots[] = { {Py_mod_exec, (void*)exec_module}, {0, NULL} };
|
||||||
|
|
||||||
|
static struct PyModuleDef module_def = {PyModuleDef_HEAD_INIT};
|
||||||
|
|
||||||
|
static void
|
||||||
|
finalize(void*) {
|
||||||
|
if (initialize_called) {
|
||||||
|
espeak_Terminate();
|
||||||
|
initialize_called = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CALIBRE_MODINIT_FUNC PyInit_espeak(void) {
|
||||||
|
module_def.m_name = "espeak";
|
||||||
|
module_def.m_doc = "espeak-ng wrapper";
|
||||||
|
module_def.m_slots = slots;
|
||||||
|
module_def.m_free = finalize;
|
||||||
|
module_def.m_methods = methods;
|
||||||
|
return PyModuleDef_Init(&module_def);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user