# jbonsai
[English](README.md)
フルコンテキストラベルから音声を合成するライブラリです.JPreprocessと組み合わせると,Open JTalk相当の音声合成ができます.
[HTS Engine](https://hts-engine.sourceforge.net)をRustで書き直したものなので,HTS Engine用の日本語音声モデルを流用できます.
なお,jbonsaiとHTS Engineの出力が完全一致することは保証されていません.現状でも浮動小数点演算の微妙な違いにより,音声波形に違いがあります(整数に変換する際に丸められて結局一致することも多く,品質にはほとんど影響しない範囲です).
## 目標
- 可能な限り可読性を改善すること
- 可読性を損なわない範囲で,
- 高速であること
- メモリ消費量が少ないこと
- Webassembly向けにコンパイル可能であること
## 使い方
`Cargo.toml`に次のように書いてください.
```toml
[dependencies]
jbonsai = "0.4.2"
```
## 使用例
以下の例は,「盆栽」と読み上げる音声を生成し,`speech`変数にモノラル, 48000 HzのPCMとして格納します.
```rust
// 盆栽,名詞,一般,*,*,*,*,盆栽,ボンサイ,ボンサイ,0/4,C2
let lines = [
"xx^xx-sil+b=o/A:xx+xx+xx/B:xx-xx_xx/C:xx_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:xx_xx#xx_xx@xx_xx|xx_xx/G:4_4%0_xx_xx/H:xx_xx/I:xx-xx@xx+xx&xx-xx|xx+xx/J:1_4/K:1+1-4",
"xx^sil-b+o=N/A:-3+1+4/B:xx-xx_xx/C:02_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:4_4#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-4@1+1&1-1|1+4/J:xx_xx/K:1+1-4",
"sil^b-o+N=s/A:-3+1+4/B:xx-xx_xx/C:02_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:4_4#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-4@1+1&1-1|1+4/J:xx_xx/K:1+1-4",
"b^o-N+s=a/A:-2+2+3/B:xx-xx_xx/C:02_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:4_4#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-4@1+1&1-1|1+4/J:xx_xx/K:1+1-4",
"o^N-s+a=i/A:-1+3+2/B:xx-xx_xx/C:02_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:4_4#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-4@1+1&1-1|1+4/J:xx_xx/K:1+1-4",
"N^s-a+i=sil/A:-1+3+2/B:xx-xx_xx/C:02_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:4_4#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-4@1+1&1-1|1+4/J:xx_xx/K:1+1-4",
"s^a-i+sil=xx/A:0+4+1/B:xx-xx_xx/C:02_xx+xx/D:xx+xx_xx/E:xx_xx!xx_xx-xx/F:4_4#0_xx@1_1|1_4/G:xx_xx%xx_xx_xx/H:xx_xx/I:1-4@1+1&1-1|1+4/J:xx_xx/K:1+1-4",
"a^i-sil+xx=xx/A:xx+xx+xx/B:xx-xx_xx/C:xx_xx+xx/D:xx+xx_xx/E:4_4!0_xx-xx/F:xx_xx#xx_xx@xx_xx|xx_xx/G:xx_xx%xx_xx_xx/H:1_4/I:xx-xx@xx+xx&xx-xx|xx+xx/J:xx_xx/K:1+1-4",
];
let engine = jbonsai::Engine::load(&[
// `.htsvoice`モデルファイルへのパスです.
// 現在はjlabelの制約により,日本語の音声合成モデルのみに対応しています.
"models/hts_voice_nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice",
])?;
let speech = engine.synthesize(&lines)?;
println!(
"The synthesized voice has {} samples in total.",
speech.len()
);
```
## パフォーマンス
HTS Engineとjbonsai v0.4.1の合成速度を比較しました.合成した文は日本国憲法の前文で,約128秒と比較的長い文章です.その結果,jbonsaiは1.6–2.2倍の速度で合成できることを確認しました.なお,合成された音声波形は両者で同一でした.
この性能向上は,jbonsaiで行われた,フィルタ演算等の最適化によるものと考えられます.
また,Intel x86_64では,`-C target-cpu=native`及びそれに対応するC言語のオプションを使うことで,HTS Engine,jbonsaiともに大幅に性能が向上しました(「結果詳細」参照).
なお,このベンチマークは2026年6月,jbonsai v0.4.1に対し当時の最新版のツールを用いて行われました.より新しいjbonsaiのバージョンや,より新しいrustc,LLVM等では異なった結果となる可能性があります.
加えて,今回は音声全体を合成する時間を計測しましたが,jbonsaiはストリーミング合成にも対応しています.ボイスチャットの代わり等,リアルタイム性が重要な用途でお使いください.

<details>
<summary>結果詳細</summary>
| Intel Core i5-13500 | hts_engine_default | 1.8076678 |
| Intel Core i5-13500 | hts_engine_native | 1.4573735 |
| Intel Core i5-13500 | jbonsai_default | 0.9408125 |
| Intel Core i5-13500 | jbonsai_lto | 0.9374387 |
| Intel Core i5-13500 | jbonsai_native | 0.8016296 |
| Apple M2 | hts_engine_default | 2.0302433 |
| Apple M2 | hts_engine_native | 1.9764867 |
| Apple M2 | jbonsai_default | 0.9127072 |
| Apple M2 | jbonsai_lto | 0.8880196 |
| Apple M2 | jbonsai_native | 0.8853029 |
| Raspberry Pi 4 | hts_engine_default | 14.1488875 |
| Raspberry Pi 4 | hts_engine_native | 14.1636672 |
| Raspberry Pi 4 | jbonsai_default | 8.2963959 |
| Raspberry Pi 4 | jbonsai_lto | 8.3044165 |
| Raspberry Pi 4 | jbonsai_native | 8.5164151 |
| Compute Module 3 | hts_engine_default | 32.7140591 |
| Compute Module 3 | hts_engine_native | 32.7214677 |
| Compute Module 3 | jbonsai_default | 22.0358614 |
| Compute Module 3 | jbonsai_lto | 21.9978278 |
| Compute Module 3 | jbonsai_native | 18.8089429 |
### Core i5-13500 (Manjaro Linux, Clang 22.1.5, Rustc 1.98.0-nightly)

### Apple M2 (macOS 26.4.1, Homebrew Clang 22.1.7, Rustc 1.98.0-nightly)

### Raspberry Pi 4 (Debian GNU/Linux 13, Clang 22.1.8, Rustc 1.98.0-nightly)

### Compute Module 3 (Debian GNU/Linux 13, Clang 22.1.8, Rustc 1.98.0-nightly)

</details>
<details>
<summary>手法</summary>
### 目的・評価方法
このベンチマークでは,音声モデルとしてtohoku-f01-neutralを用いたとき,日本国憲法前文を合成するのにかかる時間を測定した.合成された音声サンプルは約128秒(6,130,960 サンプル, 48 kHz)であった.合成速度の評価の前に,`cmp`を用い,生の音声出力が両者で完全に一致することを確認している.
### 評価対象
HTS Engineとjbonsaiの違いに加え,コンパイルオプションによる違いを見るため,以下の5つの組み合わせについて評価を行いました.
- **HTS Engine (Default):** LTO最適化を有効化したほかは通常のRelease条件でコンパイル (`-DCMAKE_BUILD_TYPE=Release -DCPU_NATIVE=OFF`).
- **HTS Engine (Native):** LTO最適化を有効化し,かつNativeのCPU向けにコンパイル (`-DCPU_NATIVE=ON`).
- **jbonsai (Default):** Cargoを用い,通常のRelease条件でコンパイルしている.`codegen-units=1`を指定し,また,LTOは無効化している (`lto=off`).
- **jbonsai (LTO):** Defaultに加え,LTOを有効化 (`lto=on`)
- **jbonsai (Native):** LTOに加え,NativeのCPU向けにコンパイル (`-C target-cpu=native`)
### 測定
コンパイルと測定は,共通のシェルスクリプト(コミットID `86441a40b74780afef9aa9901ac5602ffd8788fd`の`hts-bench/bench.sh`)を用いて行われた.ただし,いくつかの環境ではこのスクリプトに変更を加えているので,「環境」の項を参照のこと.
測定は`hyperfine` (v1.19.0 / v1.20.0)を用いて行われた.それぞれ本測定の前に5回のウォームアップを行い,続けて25回実行時間の測定を行った.
### 環境
測定は4台の異なるコンピュータを用いて行われた.それぞれのOS等の制約に合わせるため,後述するように測定スクリプトを一部変更している.
| **Intel Core i5-13500**<br>(14 Cores / 20 Threads) | `x86_64` | Manjaro Linux | Clang 22.1.5<br>Rustc 1.98.0-nightly (f428d123a 2026-06-19)<br>LLD 22.1.5 | PL2 power limit capped at 65W via sysfs;<br>`powersave` scaling governor |
| **Apple M2**<br>(8 Physical Cores) | `arm64` | macOS 26.4.1 | Homebrew Clang 22.1.7<br>Rustc 1.98.0-nightly (f428d123a 2026-06-19)<br>Homebrew LLD 22.1.7 | N/A (OS-managed) |
| **Raspberry Pi 4**<br>(Cortex-A72, 4 Cores) | `aarch64` | Debian GNU/Linux 13 (trixie) | Clang 22.1.8<br>Rustc 1.98.0-nightly (1f087276b 2026-06-13)<br>LLD 22 | `ondemand` scaling governor |
| **Compute Module 3**<br>(Cortex-A53, 4 Cores) | `aarch64` | Debian GNU/Linux 13 (trixie) | Clang 22.1.8<br>Rustc 1.98.0-nightly (1f087276b 2026-06-13)<br>LLD 22 | `ondemand` scaling governor |
> **測定スクリプトの変更について**
>
> - **Intel Core i5-13500:** Rustのコンパイルでローカルのリンカを用いるよう,`-fuse-ld=lld-22`から`-fuse-ld=lld`に変更している.
>
> - **Apple M2 (macOS):** システム情報の取得を,Linux向けのコマンドからMacのコマンドに変更している (`sysctl`, `vm_stat`, `sw_vers`).また,LTOを有効化した際でもコンパイルが通るようにするため,Cargoのコンパイルオプションを一部変更している.
</details>
## Copyright
このソフトウェアは以下のコードを使用しています.
- [hts_engine API](https://hts-engine.sourceforge.net).
- Copyright (c) 2001-2014 Nagoya Institute of Technology Department of Computer Science
- Copyright (c) 2001-2008 Tokyo Institute of Technology Interdisciplinary Graduate School of Science and Engineering
## ライセンス
BSD-3-Clause