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

Update README #24

Merged
merged 32 commits into from
May 22, 2024
Merged
Changes from 19 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
6c1ca52
add lead paragraph
femshima May 19, 2024
6050b36
add "discord bot"
femshima May 20, 2024
fbb9515
install and usage
cm-ayf May 21, 2024
c862396
typo in README
cm-ayf May 22, 2024
77846d0
リポジトリ
cm-ayf May 22, 2024
ec2bc04
better install procedure
cm-ayf May 22, 2024
b1fb94f
better folder handling
cm-ayf May 22, 2024
bf6454d
してください
cm-ayf May 22, 2024
f577518
remove cross compilation settings
cm-ayf May 22, 2024
e3b9dc4
better explanation on streaming synthesis
cm-ayf May 22, 2024
69d6f57
explanation on streaming synthesis
cm-ayf May 22, 2024
bd1312c
better explanation on model exampleness
cm-ayf May 22, 2024
71506f9
annotation on jbonsai models
cm-ayf May 22, 2024
b66e8e4
想定して
cm-ayf May 22, 2024
bcd651a
this library
cm-ayf May 22, 2024
3a30de2
日本語
cm-ayf May 22, 2024
bfea10b
fix
cm-ayf May 22, 2024
688372c
better usage
cm-ayf May 22, 2024
69d5dd8
declare to change version in readme every time
cm-ayf May 22, 2024
bbeff56
latest release
cm-ayf May 22, 2024
ed5e780
eliminate inconsistent code span
cm-ayf May 22, 2024
1c43a5e
clarify return type
cm-ayf May 22, 2024
1c69935
restructure into quickstart
cm-ayf May 22, 2024
4541ef6
specify path to extract tars
cm-ayf May 22, 2024
538eebf
specify directory by cwd
cm-ayf May 22, 2024
4463341
add dictionary url
cm-ayf May 22, 2024
32124f8
pin dictionary version
cm-ayf May 22, 2024
06e8aee
eliminate br
cm-ayf May 22, 2024
2f431d3
strange space
cm-ayf May 22, 2024
c96c1e8
not latest
cm-ayf May 22, 2024
c2215fc
swap link
cm-ayf May 22, 2024
cbf39ca
eliminate space 2
cm-ayf May 22, 2024
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
76 changes: 67 additions & 9 deletions README.md
cm-ayf marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -1,15 +1,73 @@
# om-syrinx

## Cross compilation settings
om-syrinx(読み方:おーむ・しーりんくす)は,Discordの読み上げボット「[om](https://github.com/discordjs-japan/om)」のために作られた,日本語音声合成ライブラリです.

To avoid linker error, write the following to your `~/.cargo/config.toml`
(if your native environment is `x86_64-unknown-linux-gnu`).
om-syrinxでは,入力全体を一度に処理するのではなく,順番に少量ずつ合成と出力を行います(準リアルタイム音声合成).これにより,テキストが入力されてから音声が再生できるまでの時間が短くなるため,テキストチャンネルに投稿されたメッセージをいち早く読み上げはじめることができます.

```toml
[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-gcc"
rustflags = ["-C", "target-feature=-crt-static"]
実際のテキスト処理と音声合成はそれぞれ「[jpreprocess](https://crates.io/crates/jpreprocess)」と「[jbonsai](https://crates.io/crates/jbonsai)」が担っています.om-syrinxはこれらとNode.jsとのバインディングに加え,スレッド管理,バッファリング,opusへのエンコード機能を提供します.

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
## インストール

### ライブラリ本体

以下を実行してください:
```sh
npm install github:discordjs-japan/om-syrinx#v0.3.0
```

### jpreprocess用の辞書

1. [`jperprocess`のリリース](https://github.com/jpreprocess/jpreprocess/releases)から最新の辞書 (`naist-jdic-jpreprocess.tar.gz`) をダウンロードしてください.
1. `tar xz`等で展開して,生成される`naist-jdic`フォルダを適切な場所に配置してください.

### jbonsai用のモデル

jbonsaiは,[HTS Engine](https://hts-engine.sourceforge.net)でも用いられる`.htsvoice`モデルを使用して音声を合成します.
ここでは例として,[`htsvoice-tohoku-f01`](https://github.com/icn-lab/htsvoice-tohoku-f01)を使用します.`htsvoice-tohoku-f01`は,4つの`.htsvoice`モデルを含むリポジトリです.他の`.htsvoice`モデルを使用することもできます.

1. `htsvoice-tohoku-f01`の`master`ブランチ (<https://github.com/icn-lab/htsvoice-tohoku-f01/archive/refs/heads/master.tar.gz>) をダウンロードしてください.
1. `tar xz`等で展開して,生成される`htsvoice-tohoku-f01-master`フォルダを適切な場所に配置してください.

## 使い方

ここでは,`inputText`から`stream`を生成する例を示します.

```ts
import { Syrinx, EncoderType, type SynthesisOption } from "@discordjs-japan/om-syrinx";

// インスタンスを生成
const syrinx = Syrinx.fromConfig({
dictionary: "naist-jdic",
models: ["htsvoice-tohoku-f01-master/tohoku-f01-neutral.htsvoice"],
encoder: { type: EncoderType.Opus },
});

// 音声を合成
const inputText = "鳴管は、鳥類のもつ発声器官。";
const option: SynthesisOption = {};
const stream = syrinx.synthesize(inputText, option);

// @discordjs/voice で利用
import { createAudioResource, StreamType } from "@discordjs/voice";

const resource = createAudioResource(stream, { inputType: StreamType.Opus });
```

`Syrinx.fromConfig()`でインスタンスを生成する際に必須の設定は以下の通りです:
- `dictionary`:[`jpreprocess`用の辞書](#jpreprocess用の辞書)のフォルダのパス
- `models`:[`jbonsai`用のモデル](#jbonsai用のモデル)の`.htsvoice`ファイルのパスの配列
- `encoder`:エンコード設定
- `EncoderType.Opus`の場合,Opusでエンコードされます.`@discordjs/voice`の`StreamType.Opus`に対応します.
- `EncoderType.Raw`の場合,16ビットPCMに変換されます.`@discordjs/voice`の`StreamType.Raw`に対応します.

その他の設定については,`EncoderConfig`を参照してください.

`syrinx.synthesize()`で音声を合成する際に渡す引数は以下の通りです:
- `inputText`:合成するテキスト
- `option`:合成される音声を調整するオプション.詳しくは,`SynthesisOption`を参照してください.

返り値の`stream`は`Readable`で,`encoder`設定の通りにエンコードされた音声データが流れます.
- `encoder.type`が`EncoderType.Opus`の場合,`stream`は object mode の`Readable`で,1つのオブジェクトが1つのOpusフレームに対応します.
- `encoder.type`が`EncoderType.Raw`の場合,`stream`は通常 (non-object mode) の`Readable`で,16ビットPCMのデータが流れます.

合成はメインスレッドとは別のスレッドで行われます.メインスレッドは出力を非同期に受け取ります.