Skip to content

Commit

Permalink
voicevox: init at 0.20.0 (#319403)
Browse files Browse the repository at this point in the history
  • Loading branch information
TomaSajt authored Dec 21, 2024
2 parents 2daf4d1 + 8896d11 commit 3add6c8
Show file tree
Hide file tree
Showing 7 changed files with 579 additions and 0 deletions.
74 changes: 74 additions & 0 deletions pkgs/by-name/vo/voicevox-core/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
{
lib,
stdenv,
fetchzip,
autoPatchelfHook,
}:

let
platformInfoTable = {
"x86_64-linux" = {
id = "linux-x64";
hash = "sha256-/PD5e0bWgnIsIrvyOypoJw30VkgbOFWV1NJpPS2G0WM=";
};
"aarch64-linux" = {
id = "linux-arm64";
hash = "sha256-zfiorXZyIISZPXPwmcdYeHceDmQXkUhsvTkNZScg648=";
};
"x86_64-darwin" = {
id = "osx-x64";
hash = "sha256-cdNdV1fVPkz6B7vtKZiPsLQGqnIiDtYa9KTcwSkjdJg=";
};
"aarch64-darwin" = {
id = "osx-arm64";
hash = "sha256-Z1dq2t/HBQulbPF23ZCihOrcZHMpTXEQ6yXKORZaFPk=";
};
};

platformInfo =
platformInfoTable.${stdenv.hostPlatform.system}
or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
in
stdenv.mkDerivation (finalAttrs: {
pname = "voicevox-core";
version = "0.15.4";

# Note: Only the prebuilt binaries are able to decrypt the encrypted voice models
src = fetchzip {
url = "https://github.com/VOICEVOX/voicevox_core/releases/download/${finalAttrs.version}/voicevox_core-${platformInfo.id}-cpu-${finalAttrs.version}.zip";
inherit (platformInfo) hash;
};

nativeBuildInputs = lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ];

buildInputs = [ stdenv.cc.cc.lib ];

installPhase = ''
runHook preInstall
install -Dm755 libonnxruntime.* libvoicevox_core.* -t $out/lib
install -Dm644 model/* -t $out/lib/model
install -Dm644 *.h -t $out/include
install -Dm644 README.txt -t $out/share/doc/voicevox-core
runHook postInstall
'';

meta = {
changelog = "https://github.com/VOICEVOX/voicevox_core/releases/tag/${finalAttrs.version}";
description = "Core library for the VOICEVOX speech synthesis software";
homepage = "https://github.com/VOICEVOX/voicevox_core";
license = with lib.licenses; [
mit
({
name = "VOICEVOX Core Library Terms of Use";
url = "https://github.com/VOICEVOX/voicevox_resource/blob/main/core/README.md";
free = false;
redistributable = true;
})
];
maintainers = with lib.maintainers; [ tomasajt ];
platforms = lib.attrNames platformInfoTable;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
};
})
21 changes: 21 additions & 0 deletions pkgs/by-name/vo/voicevox-engine/make-installable.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
diff --git a/pyproject.toml b/pyproject.toml
index fa23446..6a7705c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -40,7 +40,15 @@ use_parentheses = true
datas = "datas" # PyInstaller's argument

[tool.poetry]
-package-mode = false
+name = "voicevox-engine"
+version = "@version@"
+authors = []
+description = ""
+packages = [ { include = "voicevox_engine" } ]
+include = [ "resources/**/*", "run.py", "engine_manifest.json", "presets.yaml"]
+
+[tool.poetry.scripts]
+voicevox-engine = "run:main"

[tool.poetry.dependencies]
python = "~3.11"
92 changes: 92 additions & 0 deletions pkgs/by-name/vo/voicevox-engine/mecab-remove-deprecated.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
diff --git a/lib/open_jtalk/src/mecab/src/char_property.h b/lib/open_jtalk/src/mecab/src/char_property.h
index 35f4b05..9c904ba 100644
--- a/lib/open_jtalk/src/mecab/src/char_property.h
+++ b/lib/open_jtalk/src/mecab/src/char_property.h
@@ -37,7 +37,7 @@ class CharProperty {
inline const char *seekToOtherType(const char *begin, const char *end,
CharInfo c, CharInfo *fail,
size_t *mblen, size_t *clen) const {
- register const char *p = begin;
+ const char *p = begin;
*clen = 0;
while (p != end && c.isKindOf(*fail = getCharInfo(p, end, mblen))) {
p += *mblen;
diff --git a/lib/open_jtalk/src/mecab/src/darts.h b/lib/open_jtalk/src/mecab/src/darts.h
index 91b2eae..d6736cf 100644
--- a/lib/open_jtalk/src/mecab/src/darts.h
+++ b/lib/open_jtalk/src/mecab/src/darts.h
@@ -404,10 +404,10 @@ class DoubleArrayImpl {
T result;
set_result(result, -1, 0);

- register array_type_ b = array_[node_pos].base;
- register array_u_type_ p;
+ array_type_ b = array_[node_pos].base;
+ array_u_type_ p;

- for (register size_t i = 0; i < len; ++i) {
+ for (size_t i = 0; i < len; ++i) {
p = b +(node_u_type_)(key[i]) + 1;
if (static_cast<array_u_type_>(b) == array_[p].check)
b = array_[p].base;
@@ -431,12 +431,12 @@ class DoubleArrayImpl {
size_t node_pos = 0) const {
if (!len) len = length_func_()(key);

- register array_type_ b = array_[node_pos].base;
- register size_t num = 0;
- register array_type_ n;
- register array_u_type_ p;
+ array_type_ b = array_[node_pos].base;
+ size_t num = 0;
+ array_type_ n;
+ array_u_type_ p;

- for (register size_t i = 0; i < len; ++i) {
+ for (size_t i = 0; i < len; ++i) {
p = b; // + 0;
n = array_[p].base;
if ((array_u_type_) b == array_[p].check && n < 0) {
@@ -469,8 +469,8 @@ class DoubleArrayImpl {
size_t len = 0) const {
if (!len) len = length_func_()(key);

- register array_type_ b = array_[node_pos].base;
- register array_u_type_ p;
+ array_type_ b = array_[node_pos].base;
+ array_u_type_ p;

for (; key_pos < len; ++key_pos) {
p = b +(node_u_type_)(key[key_pos]) + 1;
diff --git a/lib/open_jtalk/src/mecab/src/dictionary.cpp b/lib/open_jtalk/src/mecab/src/dictionary.cpp
index 5717d4d..3ab6e1f 100644
--- a/lib/open_jtalk/src/mecab/src/dictionary.cpp
+++ b/lib/open_jtalk/src/mecab/src/dictionary.cpp
@@ -66,7 +66,7 @@ int progress_bar_darts(size_t current, size_t total) {
}

template <typename T1, typename T2>
-struct pair_1st_cmp: public std::binary_function<bool, T1, T2> {
+struct pair_1st_cmp {
bool operator()(const std::pair<T1, T2> &x1,
const std::pair<T1, T2> &x2) {
return x1.first < x2.first;
diff --git a/lib/open_jtalk/src/mecab/src/viterbi.cpp b/lib/open_jtalk/src/mecab/src/viterbi.cpp
index 6277fe9..5ccefb7 100644
--- a/lib/open_jtalk/src/mecab/src/viterbi.cpp
+++ b/lib/open_jtalk/src/mecab/src/viterbi.cpp
@@ -318,11 +318,11 @@ template <bool IsAllPath> bool connect(size_t pos, Node *rnode,
const Connector *connector,
Allocator<Node, Path> *allocator) {
for (;rnode; rnode = rnode->bnext) {
- register long best_cost = 2147483647;
+ long best_cost = 2147483647;
Node* best_node = 0;
for (Node *lnode = end_node_list[pos]; lnode; lnode = lnode->enext) {
- register int lcost = connector->cost(lnode, rnode); // local cost
- register long cost = lnode->cost + lcost;
+ int lcost = connector->cost(lnode, rnode); // local cost
+ long cost = lnode->cost + lcost;

if (cost < best_cost) {
best_node = lnode;
126 changes: 126 additions & 0 deletions pkgs/by-name/vo/voicevox-engine/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
{
lib,
fetchFromGitHub,
python3Packages,
replaceVars,
voicevox-core,
}:

python3Packages.buildPythonApplication rec {
pname = "voicevox-engine";
version = "0.20.0";
pyproject = true;

src = fetchFromGitHub {
owner = "VOICEVOX";
repo = "voicevox_engine";
rev = "refs/tags/${version}";
hash = "sha256-Gib5R7oleg+XXyu2V65EqrflQ1oiAR7a09a0MFhSITc=";
};

patches = [
# the upstream package only uses poetry for dependency management, not for package definition
# this patch makes the package installable via poetry-core
(replaceVars ./make-installable.patch {
inherit version;
})
];

build-system = with python3Packages; [
poetry-core
];

dependencies =
[
passthru.pyopenjtalk
]
++ (with python3Packages; [
numpy
fastapi
jinja2
python-multipart
uvicorn
soundfile
pyyaml
pyworld
semver
platformdirs
soxr
pydantic
starlette
]);

pythonRemoveDeps = [
# upstream wants fastapi-slim, but we provide fastapi instead
"fastapi-slim"
];

pythonRelaxDeps = true;

preConfigure = ''
# copy demo metadata to temporary directory
mv resources/character_info test_character_info
# populate the `character_info` directory with the actual model metadata instead of the demo metadata
cp -r --no-preserve=all ${passthru.resources}/character_info resources/character_info
# the `character_info` directory copied from `resources` doesn't exactly have the expected format,
# so we transform them to be acceptable by `voicevox-engine`
pushd resources/character_info
for dir in *; do
# remove unused large files
rm $dir/*/*.png_large
# rename directory from "$name_$uuid" to "$uuid"
mv $dir ''${dir#*"_"}
done
popd
'';

makeWrapperArgs = [
''--add-flags "--voicelib_dir=${voicevox-core}/lib"''
];

preCheck = ''
# some tests assume $HOME actually exists
export HOME=$(mktemp -d)
# since the actual metadata files have been installed to `$out` by this point,
# we can move the demo metadata back to its place for the tests to succeed
rm -r resources/character_info
mv test_character_info resources/character_info
'';

disabledTests = [
# this test checks the behaviour of openapi
# one of the functions returns a slightly different output due to openapi version differences
"test_OpenAPIの形が変わっていないことを確認"
];

nativeCheckInputs = with python3Packages; [
pytestCheckHook
syrupy
httpx
];

passthru = {
resources = fetchFromGitHub {
owner = "VOICEVOX";
repo = "voicevox_resource";
rev = "refs/tags/${version}";
hash = "sha256-m888DF9qgGbK30RSwNnAoT9D0tRJk6cD5QY72FRkatM=";
};

pyopenjtalk = python3Packages.callPackage ./pyopenjtalk.nix { };
};

meta = {
changelog = "https://github.com/VOICEVOX/voicevox_engine/releases/tag/${version}";
description = "Engine for the VOICEVOX speech synthesis software";
homepage = "https://github.com/VOICEVOX/voicevox_engine";
license = lib.licenses.lgpl3Only;
mainProgram = "voicevox-engine";
maintainers = with lib.maintainers; [ tomasajt ];
platforms = lib.platforms.linux ++ lib.platforms.darwin;
};
}
75 changes: 75 additions & 0 deletions pkgs/by-name/vo/voicevox-engine/pyopenjtalk.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
{
lib,
python,
buildPythonPackage,
fetchFromGitHub,
fetchzip,
setuptools,
cython_0,
cmake,
numpy,
oldest-supported-numpy,
six,
tqdm,
}:

let
dic-dirname = "open_jtalk_dic_utf_8-1.11";
dic-src = fetchzip {
url = "https://github.com/r9y9/open_jtalk/releases/download/v1.11.1/${dic-dirname}.tar.gz";
hash = "sha256-+6cHKujNEzmJbpN9Uan6kZKsPdwxRRzT3ZazDnCNi3s=";
};
in
buildPythonPackage {
pname = "pyopenjtalk";
version = "0-unstable-2023-09-08";
pyproject = true;

src = fetchFromGitHub {
owner = "VOICEVOX";
repo = "pyopenjtalk";
rev = "b35fc89fe42948a28e33aed886ea145a51113f88";
hash = "sha256-DbZkCMdirI6wSRUQSJrkojyjGmViqGeQPO0kSKiw2gE=";
fetchSubmodules = true;
};

patches = [
# this patch fixes the darwin build
# open_jtalk uses mecab, which uses the register keyword and std::binary_function, which are not allowed in c++17
# this patch removes them
./mecab-remove-deprecated.patch
];

postPatch = ''
substituteInPlace pyproject.toml \
--replace-fail 'setuptools<v60.0' 'setuptools'
'';

build-system = [
setuptools
cython_0
cmake
numpy
oldest-supported-numpy
];

dontUseCmakeConfigure = true;

dependencies = [
setuptools # imports pkg_resources at runtime
numpy
six
tqdm
];

postInstall = ''
ln -s ${dic-src} $out/${python.sitePackages}/pyopenjtalk/${dic-dirname}
'';

meta = {
description = "VOICEVOX's fork of the pyopenjtalk text-to-speech library";
homepage = "https://github.com/VOICEVOX/pyopenjtalk";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ tomasajt ];
};
}
Loading

0 comments on commit 3add6c8

Please sign in to comment.