Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

voicevox: init at 0.20.0 #319403

Merged
merged 3 commits into from
Dec 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
TomaSajt marked this conversation as resolved.
Show resolved Hide resolved
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 {
TomaSajt marked this conversation as resolved.
Show resolved Hide resolved
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 = ''
TomaSajt marked this conversation as resolved.
Show resolved Hide resolved
# 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
Loading