termux-tts 1.4.3 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/release.yml +98 -98
- package/CHANGELOG.md +69 -57
- package/LICENSE +17 -17
- package/README.md +138 -441
- package/README.pypi.md +54 -441
- package/bin/cli.js +33 -33
- package/doc.config.yaml +596 -532
- package/docs/benchmarks.md +11 -11
- package/index.js +5 -5
- package/install.sh +53 -53
- package/package.json +57 -57
- package/pyproject.toml +81 -81
- package/setup.py +38 -38
- package/termux_tts/__init__.py +74 -64
- package/termux_tts/audio.py +6 -3
- package/termux_tts/cli.py +27 -10
- package/termux_tts/control/component.py +398 -398
- package/termux_tts/engine.py +73 -7
- package/termux_tts/engine_multilingual.py +374 -0
- package/termux_tts/engine_native.py +104 -104
- package/termux_tts/engine_sherpa.py +2 -1
- package/termux_tts/engine_sherpa_capi.py +491 -0
- package/termux_tts/exceptions.py +28 -28
- package/termux_tts/hardware.py +34 -1
- package/termux_tts/installer.py +154 -12
- package/termux_tts/script_classifier.py +253 -0
- package/termux_tts/tokenizer.py +186 -184
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
- master
|
|
8
|
-
tags:
|
|
9
|
-
- 'v*'
|
|
10
|
-
workflow_dispatch:
|
|
11
|
-
|
|
12
|
-
permissions:
|
|
13
|
-
contents: read
|
|
14
|
-
|
|
15
|
-
jobs:
|
|
16
|
-
publish-pypi:
|
|
17
|
-
name: Publish to PyPI
|
|
18
|
-
runs-on: ubuntu-latest
|
|
19
|
-
steps:
|
|
20
|
-
- name: Checkout repository
|
|
21
|
-
uses: actions/checkout@v4
|
|
22
|
-
|
|
23
|
-
- name: Check if PyPI project exists
|
|
24
|
-
id: check-py
|
|
25
|
-
run: |
|
|
26
|
-
if [ -f "pyproject.toml" ] || [ -f "setup.py" ]; then
|
|
27
|
-
echo "has_python=true" >> $GITHUB_OUTPUT
|
|
28
|
-
else
|
|
29
|
-
echo "has_python=false" >> $GITHUB_OUTPUT
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
- name: Set up Python
|
|
33
|
-
if: steps.check-py.outputs.has_python == 'true'
|
|
34
|
-
uses: actions/setup-python@v5
|
|
35
|
-
with:
|
|
36
|
-
python-version: '3.11'
|
|
37
|
-
|
|
38
|
-
- name: Install build dependencies
|
|
39
|
-
if: steps.check-py.outputs.has_python == 'true'
|
|
40
|
-
run: |
|
|
41
|
-
python -m pip install --upgrade pip
|
|
42
|
-
pip install build twine
|
|
43
|
-
|
|
44
|
-
- name: Build distributions
|
|
45
|
-
if: steps.check-py.outputs.has_python == 'true'
|
|
46
|
-
run: python -m build
|
|
47
|
-
|
|
48
|
-
- name: Verify distribution archives
|
|
49
|
-
if: steps.check-py.outputs.has_python == 'true'
|
|
50
|
-
run: twine check dist/*
|
|
51
|
-
|
|
52
|
-
- name: Publish to PyPI
|
|
53
|
-
if: steps.check-py.outputs.has_python == 'true'
|
|
54
|
-
env:
|
|
55
|
-
TWINE_USERNAME: __token__
|
|
56
|
-
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
57
|
-
run: |
|
|
58
|
-
twine upload --skip-existing dist/*
|
|
59
|
-
|
|
60
|
-
publish-npm:
|
|
61
|
-
name: Publish to NPM
|
|
62
|
-
runs-on: ubuntu-latest
|
|
63
|
-
steps:
|
|
64
|
-
- name: Checkout repository
|
|
65
|
-
uses: actions/checkout@v4
|
|
66
|
-
|
|
67
|
-
- name: Set up Node.js
|
|
68
|
-
uses: actions/setup-node@v4
|
|
69
|
-
with:
|
|
70
|
-
node-version: '20'
|
|
71
|
-
registry-url: 'https://registry.npmjs.org'
|
|
72
|
-
|
|
73
|
-
- name: Publish NPM package
|
|
74
|
-
env:
|
|
75
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
76
|
-
run: |
|
|
77
|
-
if [ -f "package.json" ]; then
|
|
78
|
-
PKG_NAME=$(node -p "require('./package.json').name")
|
|
79
|
-
PKG_VER=$(node -p "require('./package.json').version")
|
|
80
|
-
if [ "$(npm view ${PKG_NAME}@${PKG_VER} version 2>/dev/null)" = "${PKG_VER}" ]; then
|
|
81
|
-
echo "Version ${PKG_VER} of ${PKG_NAME} is already published on NPM. Skipping."
|
|
82
|
-
else
|
|
83
|
-
echo "Publishing ${PKG_NAME}@${PKG_VER} to NPM..."
|
|
84
|
-
npm publish --access public
|
|
85
|
-
fi
|
|
86
|
-
elif [ -f "npm/package.json" ]; then
|
|
87
|
-
cd npm
|
|
88
|
-
PKG_NAME=$(node -p "require('./package.json').name")
|
|
89
|
-
PKG_VER=$(node -p "require('./package.json').version")
|
|
90
|
-
if [ "$(npm view ${PKG_NAME}@${PKG_VER} version 2>/dev/null)" = "${PKG_VER}" ]; then
|
|
91
|
-
echo "Version ${PKG_VER} of ${PKG_NAME} is already published on NPM. Skipping."
|
|
92
|
-
else
|
|
93
|
-
echo "Publishing ${PKG_NAME}@${PKG_VER} to NPM..."
|
|
94
|
-
npm publish --access public
|
|
95
|
-
fi
|
|
96
|
-
else
|
|
97
|
-
echo "No package.json found. Skipping NPM publish."
|
|
98
|
-
fi
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
- master
|
|
8
|
+
tags:
|
|
9
|
+
- 'v*'
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
publish-pypi:
|
|
17
|
+
name: Publish to PyPI
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout repository
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- name: Check if PyPI project exists
|
|
24
|
+
id: check-py
|
|
25
|
+
run: |
|
|
26
|
+
if [ -f "pyproject.toml" ] || [ -f "setup.py" ]; then
|
|
27
|
+
echo "has_python=true" >> $GITHUB_OUTPUT
|
|
28
|
+
else
|
|
29
|
+
echo "has_python=false" >> $GITHUB_OUTPUT
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
- name: Set up Python
|
|
33
|
+
if: steps.check-py.outputs.has_python == 'true'
|
|
34
|
+
uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: '3.11'
|
|
37
|
+
|
|
38
|
+
- name: Install build dependencies
|
|
39
|
+
if: steps.check-py.outputs.has_python == 'true'
|
|
40
|
+
run: |
|
|
41
|
+
python -m pip install --upgrade pip
|
|
42
|
+
pip install build twine
|
|
43
|
+
|
|
44
|
+
- name: Build distributions
|
|
45
|
+
if: steps.check-py.outputs.has_python == 'true'
|
|
46
|
+
run: python -m build
|
|
47
|
+
|
|
48
|
+
- name: Verify distribution archives
|
|
49
|
+
if: steps.check-py.outputs.has_python == 'true'
|
|
50
|
+
run: twine check dist/*
|
|
51
|
+
|
|
52
|
+
- name: Publish to PyPI
|
|
53
|
+
if: steps.check-py.outputs.has_python == 'true'
|
|
54
|
+
env:
|
|
55
|
+
TWINE_USERNAME: __token__
|
|
56
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
57
|
+
run: |
|
|
58
|
+
twine upload --skip-existing dist/*
|
|
59
|
+
|
|
60
|
+
publish-npm:
|
|
61
|
+
name: Publish to NPM
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
steps:
|
|
64
|
+
- name: Checkout repository
|
|
65
|
+
uses: actions/checkout@v4
|
|
66
|
+
|
|
67
|
+
- name: Set up Node.js
|
|
68
|
+
uses: actions/setup-node@v4
|
|
69
|
+
with:
|
|
70
|
+
node-version: '20'
|
|
71
|
+
registry-url: 'https://registry.npmjs.org'
|
|
72
|
+
|
|
73
|
+
- name: Publish NPM package
|
|
74
|
+
env:
|
|
75
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
76
|
+
run: |
|
|
77
|
+
if [ -f "package.json" ]; then
|
|
78
|
+
PKG_NAME=$(node -p "require('./package.json').name")
|
|
79
|
+
PKG_VER=$(node -p "require('./package.json').version")
|
|
80
|
+
if [ "$(npm view ${PKG_NAME}@${PKG_VER} version 2>/dev/null)" = "${PKG_VER}" ]; then
|
|
81
|
+
echo "Version ${PKG_VER} of ${PKG_NAME} is already published on NPM. Skipping."
|
|
82
|
+
else
|
|
83
|
+
echo "Publishing ${PKG_NAME}@${PKG_VER} to NPM..."
|
|
84
|
+
npm publish --access public
|
|
85
|
+
fi
|
|
86
|
+
elif [ -f "npm/package.json" ]; then
|
|
87
|
+
cd npm
|
|
88
|
+
PKG_NAME=$(node -p "require('./package.json').name")
|
|
89
|
+
PKG_VER=$(node -p "require('./package.json').version")
|
|
90
|
+
if [ "$(npm view ${PKG_NAME}@${PKG_VER} version 2>/dev/null)" = "${PKG_VER}" ]; then
|
|
91
|
+
echo "Version ${PKG_VER} of ${PKG_NAME} is already published on NPM. Skipping."
|
|
92
|
+
else
|
|
93
|
+
echo "Publishing ${PKG_NAME}@${PKG_VER} to NPM..."
|
|
94
|
+
npm publish --access public
|
|
95
|
+
fi
|
|
96
|
+
else
|
|
97
|
+
echo "No package.json found. Skipping NPM publish."
|
|
98
|
+
fi
|
package/CHANGELOG.md
CHANGED
|
@@ -1,57 +1,69 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
## [1.4.
|
|
6
|
-
|
|
7
|
-
### Added
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## [1.4.
|
|
27
|
-
|
|
28
|
-
###
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [1.4.4] - 2026-09-14
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Multilingual Neural Orchestrator**: Integrated `MultilingualNeuralEngine` capable of dynamic cross-language code-switching across 9 official languages (ko, en, ja, zh, hi, ru, es, fr, de).
|
|
9
|
+
- **Resident C-API Acceleration**: Implemented `SherpaResidentManager` and `SherpaCapiSession` for in-memory model caching via direct C-API bindings, achieving sub-0.18x RTF and eliminating subprocess invocation overhead.
|
|
10
|
+
- **Zero-Config CLI Ergonomics**: Promoted speech synthesis (`synth`) as the default top-level subcommand; allows direct positional text (`termux-tts "text" --play`); eliminated necessity of `-e multilingual` flag.
|
|
11
|
+
- **Universal Unicode Script Classifier**: Built `MultilingualTokenizer` covering Hangul, Latin, Devanagari (Hindi), Cyrillic (Russian), CJK, and Arabic scripts with 50ms smooth pause padding.
|
|
12
|
+
- **On-Demand Model Provisioning & Self-Healing**: Enhanced `termux-tts install` to provision English/Korean by default, with on-demand flags (`--models hi/ja/ru/zh/all`) and actionable English guidance with absolute paths for uninstalled models.
|
|
13
|
+
- **Defensive Path Resolution**: Hardened path parsing across `AudioBuffer.save()` and CLI entrypoints with automatic directory creation and `Path.expanduser()` resolution.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## [1.4.3] - 2026-09-07
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- **Multi-Tier Dynamic Candidate Resolution**: Replaced single hardcoded `v1.0.0-vulkan` URL in `installer.py` with 4-tier candidate resolution (`TERMUX_TTS_RELEASE_TAG`, `v{__version__}`, `releases/latest/download`, `uno-km/ameva-runtime` SSOT fallback, and companion fallback).
|
|
21
|
+
- **Dual-Path Installation**: Installs and links precompiled Vulkan binary `sherpa-ncnn-offline-tts` to both `~/.local/bin` and `$PREFIX/bin` for instant global PATH resolution.
|
|
22
|
+
- **Dynamic SSOT User-Agent**: Injects dynamic package version into download requests.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## [1.4.2] - 2026-09-07
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- Complete 12-tier enterprise English documentation overhaul for PyPI and GitHub/NPM.
|
|
30
|
+
- Detailed empirical mobile hardware benchmarks (Snapdragon 8 Elite / Adreno 830, Exynos 1380 / Mali-G68 MP5).
|
|
31
|
+
- Full GPU interconnect architecture documentation with SPIR-V compute shader details.
|
|
32
|
+
- Comprehensive CPU vs. GPU thermal dissipation and latency trade-off analysis.
|
|
33
|
+
- 3-stage 24/7 unattended background execution guide (Termux wake-lock, battery optimization, ADB phantom process killer).
|
|
34
|
+
- Expanded technical SEO metadata keywords (34 keywords).
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## [1.4.1] - 2026-09-07
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
- Fixed npm package.json bin path specification (removed './' prefix).
|
|
42
|
+
- Integrated GitHub Actions automated CI/CD release workflow.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## [1.4.0] - 2026-09-07
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
- Direct integration with `TtsAdapter` from `ameva_runtime.adapters` SSOT.
|
|
50
|
+
- Dual-tier VITS Vulkan neural engine routing with strict Fail-Fast error semantics.
|
|
51
|
+
- English localization for all diagnostics, logs, and exception messages.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## [1.1.5] - 2026-09-05
|
|
56
|
+
|
|
57
|
+
### Changed
|
|
58
|
+
- Synchronized install.sh hardware diagnostics binding to ameva-runtime.
|
|
59
|
+
- Modernized 12-stage hardware diagnostic bridge and documentation architecture diagrams.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## [1.1.4] - 2026-09-05
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
- Migrated hardware acceleration dependency to unified `ameva-runtime>=2.0.0` and `@ameva/runtime>=2.0.0`.
|
|
67
|
+
- Synchronized Python and npm package versions to v1.1.4.
|
|
68
|
+
|
|
69
|
+
|
package/LICENSE
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
Apache License
|
|
2
|
-
Version 2.0, January 2004
|
|
3
|
-
http://www.apache.org/licenses/
|
|
4
|
-
|
|
5
|
-
Copyright 2026 UnoKim & AMEVA Open-Source Foundation
|
|
6
|
-
|
|
7
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
you may not use this file except in compliance with the License.
|
|
9
|
-
You may obtain a copy of the License at
|
|
10
|
-
|
|
11
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
|
|
13
|
-
Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
See the License for the specific language governing permissions and
|
|
17
|
-
limitations under the License.
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright 2026 UnoKim & AMEVA Open-Source Foundation
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|