Add Nino Edition V2 full merged BF16 model (step 6000)
Browse filesComplete merged weights, codec, tokenizer/configuration, matched reference, inference helper, description, license and attribution. No standalone adapters or training checkpoints.
- .gitattributes +5 -35
- LICENSE.md +94 -0
- NOTICE +11 -0
- README.md +106 -0
- chat_template.jinja +85 -0
- codec.pth +3 -0
- config.json +39 -0
- infer.py +55 -0
- model.safetensors +3 -0
- references/g1_ni_00016.npy +3 -0
- references/g1_ni_00016.txt +1 -0
- references/g1_ni_00016.wav +3 -0
- special_tokens_map.json +0 -0
- tokenizer.json +3 -0
- tokenizer_config.json +0 -0
.gitattributes
CHANGED
|
@@ -1,35 +1,5 @@
|
|
| 1 |
-
*.
|
| 2 |
-
*.
|
| 3 |
-
*.
|
| 4 |
-
*.
|
| 5 |
-
|
| 6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
| 1 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.wav filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
tokenizer.json filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LICENSE.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# FISH AUDIO RESEARCH LICENSE AGREEMENT
|
| 2 |
+
|
| 3 |
+
**Last Updated: March 7, 2026**
|
| 4 |
+
|
| 5 |
+
## I. INTRODUCTION
|
| 6 |
+
|
| 7 |
+
This Agreement applies to any individual person or entity ("You", "Your" or "Licensee") that uses or distributes any portion or element of the Fish Audio Materials or Derivative Works thereof for any Research, Non-Commercial, or Commercial purpose. Capitalized terms not otherwise defined herein are defined in Section V below.
|
| 8 |
+
|
| 9 |
+
This Agreement is intended to allow research and non-commercial uses of the Materials free of charge. Any Commercial use of the Materials requires a separate license from Fish Audio.
|
| 10 |
+
|
| 11 |
+
By clicking "I Accept" or by using, distributing, or accessing any portion or element of the Fish Audio Materials or Derivative Works, You agree that You have read, understood and are bound by the terms of this Agreement. If You are acting on behalf of a company, organization or other entity, then "You" includes you and that entity, and You agree that You: (i) are an authorized representative of such entity with the authority to bind such entity to this Agreement, and (ii) You agree to the terms of this Agreement on that entity's behalf.
|
| 12 |
+
|
| 13 |
+
## II. RESEARCH & NON-COMMERCIAL USE LICENSE
|
| 14 |
+
|
| 15 |
+
Subject to the terms of this Agreement, Fish Audio grants You a non-exclusive, worldwide, non-transferable, non-sublicensable, revocable and royalty-free limited license under Fish Audio's intellectual property or other rights owned by Fish Audio embodied in the Fish Audio Materials to use, reproduce, distribute, and create Derivative Works of, and make modifications to, the Fish Audio Materials for any Research or Non-Commercial Purpose.
|
| 16 |
+
|
| 17 |
+
"Research Purpose" means academic or scientific advancement, and in each case, is not primarily intended for commercial advantage or monetary compensation to You or others.
|
| 18 |
+
|
| 19 |
+
"Non-Commercial Purpose" means any purpose other than a Research Purpose that is not primarily intended for commercial advantage or monetary compensation to You or others, such as personal use (i.e., hobbyist) or evaluation and testing.
|
| 20 |
+
|
| 21 |
+
## III. COMMERCIAL USE
|
| 22 |
+
|
| 23 |
+
**Any use of the Fish Audio Materials or Derivative Works for a Commercial Purpose requires a separate written license agreement from Fish Audio.** No commercial rights are granted under this Agreement.
|
| 24 |
+
|
| 25 |
+
"Commercial Purpose" means any purpose other than a Research Purpose or Non-Commercial Purpose that is primarily intended for or directed toward commercial advantage or monetary compensation to You or others, including but not limited to: (i) creating, modifying, or distributing Your product or service, including via a hosted service or application programming interface, (ii) Your business's or organization's internal operations, and (iii) any use in connection with a product or service for which You charge a fee or generate revenue, whether directly or indirectly.
|
| 26 |
+
|
| 27 |
+
To obtain a commercial license, please contact Fish Audio at:
|
| 28 |
+
|
| 29 |
+
- **Website:** [https://fish.audio](https://fish.audio)
|
| 30 |
+
- **Email:** business@fish.audio
|
| 31 |
+
|
| 32 |
+
## IV. GENERAL TERMS
|
| 33 |
+
|
| 34 |
+
Your Research and Non-Commercial License under this Agreement is subject to the following terms.
|
| 35 |
+
|
| 36 |
+
### a. Distribution & Attribution
|
| 37 |
+
|
| 38 |
+
If You distribute or make available the Fish Audio Materials or a Derivative Work to a third party, or a product or service that uses any portion of them, You shall: (i) provide a copy of this Agreement to that third party, (ii) retain the following attribution notice within a "Notice" text file distributed as a part of such copies: "This model is licensed under the Fish Audio Research License, Copyright © 39 AI, INC. All Rights Reserved.", and (iii) prominently display "Built with Fish Audio" on a related website, user interface, blogpost, about page, or product documentation.
|
| 39 |
+
|
| 40 |
+
If You create a Derivative Work, You may add your own attribution notice(s) to the "Notice" text file included with that Derivative Work, provided that You clearly indicate which attributions apply to the Fish Audio Materials and state in the "Notice" text file that You changed the Fish Audio Materials and how it was modified.
|
| 41 |
+
|
| 42 |
+
### b. Use Restrictions
|
| 43 |
+
|
| 44 |
+
Your use of the Fish Audio Materials and Derivative Works, including any output or results of the Fish Audio Materials or Derivative Works, must comply with applicable laws and regulations (including Trade Control Laws and equivalent regulations) and adhere to Fish Audio's Acceptable Use Policy, which is hereby incorporated by reference.
|
| 45 |
+
|
| 46 |
+
Furthermore, You will not use the Fish Audio Materials or Derivative Works, or any output or results of the Fish Audio Materials or Derivative Works, to create or improve any foundational generative AI model (excluding the Models or Derivative Works).
|
| 47 |
+
|
| 48 |
+
### c. Intellectual Property
|
| 49 |
+
|
| 50 |
+
**(i) Trademark License.** No trademark licenses are granted under this Agreement, and in connection with the Fish Audio Materials or Derivative Works, You may not use any name or mark owned by or associated with Fish Audio or any of its Affiliates, except as required under Section IV(a) herein.
|
| 51 |
+
|
| 52 |
+
**(ii) Ownership of Derivative Works.** As between You and Fish Audio, You are the owner of Derivative Works You create, subject to Fish Audio's ownership of the Fish Audio Materials and any Derivative Works made by or for Fish Audio.
|
| 53 |
+
|
| 54 |
+
**(iii) Ownership of Outputs.** As between You and Fish Audio, You own any outputs generated from the Models or Derivative Works to the extent permitted by applicable law.
|
| 55 |
+
|
| 56 |
+
**(iv) Disputes.** If You or Your Affiliate(s) institute litigation or other proceedings against Fish Audio (including a cross-claim or counterclaim in a lawsuit) alleging that the Fish Audio Materials, Derivative Works or associated outputs or results, or any portion of any of the foregoing, constitutes infringement of intellectual property or other rights owned or licensable by You, then any licenses granted to You under this Agreement shall terminate as of the date such litigation or claim is filed or instituted. You will indemnify and hold harmless Fish Audio from and against any claim by any third party arising out of or related to Your use or distribution of the Fish Audio Materials or Derivative Works in violation of this Agreement.
|
| 57 |
+
|
| 58 |
+
**(v) Feedback.** From time to time, You may provide Fish Audio with verbal and/or written suggestions, comments or other feedback related to Fish Audio's existing or prospective technology, products or services (collectively, "Feedback"). You are not obligated to provide Fish Audio with Feedback, but to the extent that You do, You hereby grant Fish Audio a perpetual, irrevocable, royalty-free, fully-paid, sub-licensable, transferable, non-exclusive, worldwide right and license to exploit the Feedback in any manner without restriction. Your Feedback is provided "AS IS" and You make no warranties whatsoever about any Feedback.
|
| 59 |
+
|
| 60 |
+
### d. Disclaimer of Warranty
|
| 61 |
+
|
| 62 |
+
UNLESS REQUIRED BY APPLICABLE LAW, THE FISH AUDIO MATERIALS AND ANY OUTPUT AND RESULTS THEREFROM ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OR LAWFULNESS OF USING OR REDISTRIBUTING THE FISH AUDIO MATERIALS, DERIVATIVE WORKS OR ANY OUTPUT OR RESULTS AND ASSUME ANY RISKS ASSOCIATED WITH YOUR USE OF THE FISH AUDIO MATERIALS, DERIVATIVE WORKS AND ANY OUTPUT AND RESULTS.
|
| 63 |
+
|
| 64 |
+
### e. Limitation of Liability
|
| 65 |
+
|
| 66 |
+
IN NO EVENT WILL FISH AUDIO OR ITS AFFILIATES BE LIABLE UNDER ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, TORT, NEGLIGENCE, PRODUCTS LIABILITY, OR OTHERWISE, ARISING OUT OF THIS AGREEMENT, FOR ANY LOST PROFITS OR ANY DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL, EXEMPLARY OR PUNITIVE DAMAGES, EVEN IF FISH AUDIO OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF ANY OF THE FOREGOING.
|
| 67 |
+
|
| 68 |
+
### f. Term and Termination
|
| 69 |
+
|
| 70 |
+
The term of this Agreement will commence upon Your acceptance of this Agreement or access to the Fish Audio Materials and will continue in full force and effect until terminated in accordance with the terms and conditions herein. Fish Audio may terminate this Agreement if You are in breach of any term or condition of this Agreement. Upon termination of this Agreement, You shall delete and cease use of any Fish Audio Materials or Derivative Works. Sections IV(d), (e), and (g) shall survive the termination of this Agreement.
|
| 71 |
+
|
| 72 |
+
### g. Governing Law
|
| 73 |
+
|
| 74 |
+
This Agreement will be governed by and construed in accordance with the laws of the United States and the State of California without regard to choice of law principles, and the UN Convention on Contracts for International Sale of Goods does not apply to this Agreement.
|
| 75 |
+
|
| 76 |
+
## V. DEFINITIONS
|
| 77 |
+
|
| 78 |
+
**"Affiliate(s)"** means any entity that directly or indirectly controls, is controlled by, or is under common control with the subject entity; for purposes of this definition, "control" means direct or indirect ownership or control of more than 50% of the voting interests of the subject entity.
|
| 79 |
+
|
| 80 |
+
**"Agreement"** means this Fish Audio Research License Agreement.
|
| 81 |
+
|
| 82 |
+
**"Derivative Work(s)"** means (a) any derivative work of the Fish Audio Materials as recognized by U.S. copyright laws and (b) any modifications to a Model, and any other model created which is based on or derived from the Model or the Model's output, including "fine tune" and "low-rank adaptation" models derived from a Model or a Model's output, but do not include the output of any Model.
|
| 83 |
+
|
| 84 |
+
**"Documentation"** means any specifications, manuals, documentation, and other written information provided by Fish Audio related to the Software or Models.
|
| 85 |
+
|
| 86 |
+
**"Fish Audio"** or **"we"** means 39 AI, INC. and its Affiliates.
|
| 87 |
+
|
| 88 |
+
**"Model(s)"** means, collectively, Fish Audio's proprietary models and algorithms, including machine-learning models, trained model weights and other elements of the foregoing.
|
| 89 |
+
|
| 90 |
+
**"Software"** means Fish Audio's proprietary software made available under this Agreement now or in the future.
|
| 91 |
+
|
| 92 |
+
**"Fish Audio Materials"** means, collectively, Fish Audio's proprietary Models, Software and Documentation (and any portion or combination thereof) made available under this Agreement.
|
| 93 |
+
|
| 94 |
+
**"Trade Control Laws"** means any applicable U.S. and non-U.S. export control and trade sanctions laws and regulations.
|
NOTICE
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
This model is licensed under the Fish Audio Research License, Copyright © 39 AI, INC. All Rights Reserved.
|
| 2 |
+
|
| 3 |
+
Built with Fish Audio.
|
| 4 |
+
|
| 5 |
+
Modified by Skttttt: fishaudio/s2-pro was adapted with a character-specific rank-8, alpha-16 LoRA trained on Nino speech. The step-6000 adapter was merged into the BF16 text-to-semantic weights, including slow/fast autoregressive layers and embeddings. The original frozen tied-output projection was preserved as a separate output.weight. This repository distributes the full merged model, with no standalone adapter.
|
| 6 |
+
|
| 7 |
+
Base revision: 1de9996b6be38b745688de084d87a5633f714e4e
|
| 8 |
+
Compatible source: https://github.com/TachibanaKimika/fish-speech
|
| 9 |
+
Source revision: 166940c301b8b4650b3110397a38bc68727a3afa
|
| 10 |
+
|
| 11 |
+
An unofficial fan project inspired by Nino Nakano from The Quintessential Quintuplets. Character, franchise, and reference performances remain subject to their respective rights.
|
README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
language:
|
| 3 |
+
- ja
|
| 4 |
+
license: other
|
| 5 |
+
license_name: fish-audio-research-license
|
| 6 |
+
license_link: LICENSE.md
|
| 7 |
+
base_model: fishaudio/s2-pro
|
| 8 |
+
base_model_relation: finetune
|
| 9 |
+
pipeline_tag: text-to-speech
|
| 10 |
+
tags:
|
| 11 |
+
- fish-speech
|
| 12 |
+
- s2-pro
|
| 13 |
+
- text-to-speech
|
| 14 |
+
- japanese
|
| 15 |
+
- merged
|
| 16 |
+
- nino-nakano
|
| 17 |
+
- the-quintessential-quintuplets
|
| 18 |
+
model_name: 'Fishspeech S2 Pro "Nino Edition" V2'
|
| 19 |
+
---
|
| 20 |
+
|
| 21 |
+
# Fishspeech S2 Pro "Nino Edition" V2
|
| 22 |
+
|
| 23 |
+
A Nino Nakano voice fine-tune of Fish Audio S2 Pro, made as part of my Quintessential Quintuplets fan-model collection.
|
| 24 |
+
|
| 25 |
+
Give it Japanese text and the included reference to generate new speech in this character's voice. Both the reference and the line affect pace, expression, and similarity.
|
| 26 |
+
|
| 27 |
+
**Built with Fish Audio.** This is an unofficial fan project, with no affiliation or endorsement from the creators, performers, or franchise.
|
| 28 |
+
|
| 29 |
+
## Full merged model
|
| 30 |
+
|
| 31 |
+
This repository contains the **complete BF16 merged model**. The trained Nino adaptation is already in **model.safetensors**. **No separate LoRA adapter, base-weight download, or merge step is required.** Load it as a full model with lora_config=None; do not apply an adapter again.
|
| 32 |
+
|
| 33 |
+
| File | Purpose |
|
| 34 |
+
|---|---|
|
| 35 |
+
| model.safetensors | Full merged text-to-semantic weights, 9.92 GB |
|
| 36 |
+
| codec.pth | Original pinned Fish Speech audio codec, 1.87 GB |
|
| 37 |
+
| config.json and tokenizer files | Native dual_ar configuration and tokenizer |
|
| 38 |
+
| infer.py | Wrapper around the pinned Fish Speech inference CLI |
|
| 39 |
+
| references/g1_ni_00016.wav, .txt, .npy | Matching reference audio, transcript, and precomputed codec tokens |
|
| 40 |
+
| LICENSE.md, NOTICE | License and attribution/modification notice |
|
| 41 |
+
|
| 42 |
+
The training corpus, optimizer states, checkpoint files, and standalone adapters are not included.
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
## Reference
|
| 46 |
+
|
| 47 |
+
Default: **g1_ni_00016**, matching the reference selected for the recent checkpoint auditions. The audio is preserved from the source recording.
|
| 48 |
+
|
| 49 |
+
<audio controls src="https://huggingface.co/Skttttt/Fishspeech-S2-Pro-Nino-Edition-V2/resolve/main/references/g1_ni_00016.wav"></audio>
|
| 50 |
+
|
| 51 |
+
> パパが管理を任せている人たちがいるの。年に何回か設備の点検や掃除に来てるらしいわ。
|
| 52 |
+
|
| 53 |
+
Keep the reference transcript and token file together. Changing the reference can change delivery substantially. The voice is not guaranteed to match the character exactly on every line.
|
| 54 |
+
|
| 55 |
+
## Use the model
|
| 56 |
+
|
| 57 |
+
Use the compatible [Fish Speech fork at commit 166940c301b8b4650b3110397a38bc68727a3afa](https://github.com/TachibanaKimika/fish-speech/tree/166940c301b8b4650b3110397a38bc68727a3afa). This is a native Fish Speech **dual_ar** model, not a drop-in Transformers AutoModel checkpoint.
|
| 58 |
+
|
| 59 |
+
Install the fork and a PyTorch build compatible with your hardware using that revision's instructions. The pinned project specifies PyTorch 2.8.0; accelerator support depends on your runtime.
|
| 60 |
+
|
| 61 |
+
~~~bash
|
| 62 |
+
git clone https://github.com/TachibanaKimika/fish-speech.git
|
| 63 |
+
cd fish-speech
|
| 64 |
+
git checkout 166940c301b8b4650b3110397a38bc68727a3afa
|
| 65 |
+
# Follow this revision's platform-specific dependency installation instructions.
|
| 66 |
+
~~~
|
| 67 |
+
|
| 68 |
+
Authenticate with **hf auth login** using an account with access to this private repository, then download the complete model:
|
| 69 |
+
|
| 70 |
+
~~~bash
|
| 71 |
+
hf download Skttttt/Fishspeech-S2-Pro-Nino-Edition-V2 --local-dir checkpoints/nino-v2
|
| 72 |
+
~~~
|
| 73 |
+
|
| 74 |
+
From the installed Fish Speech source directory:
|
| 75 |
+
|
| 76 |
+
~~~bash
|
| 77 |
+
python checkpoints/nino-v2/infer.py --text "今日は何をして過ごしましょうか。" --output nino.wav
|
| 78 |
+
~~~
|
| 79 |
+
|
| 80 |
+
Defaults: included reference, seed 42, BF16, 4,096-token model context, top-p 0.7, top-k 30, temperature 0.7, and at most 1,024 new audio tokens. The helper saves the WAV and generated codec tokens beside it in an output-stem_codes folder. Resource use depends on the text. Downloading the repository does not load or run inference.
|
| 81 |
+
|
| 82 |
+
## Training and checkpoint
|
| 83 |
+
|
| 84 |
+
| Setting | Value |
|
| 85 |
+
|---|---|
|
| 86 |
+
| Base | fishaudio/s2-pro |
|
| 87 |
+
| Base revision | 1de9996b6be38b745688de084d87a5633f714e4e |
|
| 88 |
+
| Character | Nino Nakano |
|
| 89 |
+
| Prepared clips | 4,691 |
|
| 90 |
+
| Train / validation / held-out test | 4,221 / 235 / 235 |
|
| 91 |
+
| Shipped checkpoint | **Step 6,000** |
|
| 92 |
+
| LoRA rank / alpha / dropout | 8 / 16 / 0.01 |
|
| 93 |
+
| Learning rate | 3e-5 |
|
| 94 |
+
| Training precision / sequence length | BF16 / 1,024 |
|
| 95 |
+
| Effective training batch | 4 |
|
| 96 |
+
| Adaptation | Slow/fast AR attention and MLP layers, embedding targets, and fast output |
|
| 97 |
+
| Merge | FP32 delta accumulation, stored as BF16 |
|
| 98 |
+
| Output projection | Original frozen projection preserved; tie_word_embeddings=false |
|
| 99 |
+
|
| 100 |
+
LoRA was the training method; the delivered artifact is the full merged model. Adapter identity, file hashes, tensor layout, and the merge were checked without instantiating the full model for inference. No post-merge GPU inference or new audio-quality test was run for this release. Compare matched listening samples and references when judging quality; loss alone is not an audio-quality measure.
|
| 101 |
+
|
| 102 |
+
## Credits and license
|
| 103 |
+
|
| 104 |
+
Thanks to **Fish Audio**, **Negi Haruba**, and the cast and crew of *The Quintessential Quintuplets*.
|
| 105 |
+
|
| 106 |
+
The model and derivative weights follow the [Fish Audio Research License](LICENSE.md). See [NOTICE](NOTICE) for attribution and modification details. Source recordings, performances, character, and franchise remain subject to their respective rights; this project does not claim ownership of them.
|
chat_template.jinja
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{%- if tools %}
|
| 2 |
+
{{- '<|im_start|>system\n' }}
|
| 3 |
+
{%- if messages[0].role == 'system' %}
|
| 4 |
+
{{- messages[0].content + '\n\n' }}
|
| 5 |
+
{%- endif %}
|
| 6 |
+
{{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>" }}
|
| 7 |
+
{%- for tool in tools %}
|
| 8 |
+
{{- "\n" }}
|
| 9 |
+
{{- tool | tojson }}
|
| 10 |
+
{%- endfor %}
|
| 11 |
+
{{- "\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\n<tool_call>\n{\"name\": <function-name>, \"arguments\": <args-json-object>}\n</tool_call><|im_end|>\n" }}
|
| 12 |
+
{%- else %}
|
| 13 |
+
{%- if messages[0].role == 'system' %}
|
| 14 |
+
{{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }}
|
| 15 |
+
{%- endif %}
|
| 16 |
+
{%- endif %}
|
| 17 |
+
{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
|
| 18 |
+
{%- for message in messages[::-1] %}
|
| 19 |
+
{%- set index = (messages|length - 1) - loop.index0 %}
|
| 20 |
+
{%- if ns.multi_step_tool and message.role == "user" and not(message.content.startswith('<tool_response>') and message.content.endswith('</tool_response>')) %}
|
| 21 |
+
{%- set ns.multi_step_tool = false %}
|
| 22 |
+
{%- set ns.last_query_index = index %}
|
| 23 |
+
{%- endif %}
|
| 24 |
+
{%- endfor %}
|
| 25 |
+
{%- for message in messages %}
|
| 26 |
+
{%- if (message.role == "user") or (message.role == "system" and not loop.first) %}
|
| 27 |
+
{{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }}
|
| 28 |
+
{%- elif message.role == "assistant" %}
|
| 29 |
+
{%- set content = message.content %}
|
| 30 |
+
{%- set reasoning_content = '' %}
|
| 31 |
+
{%- if message.reasoning_content is defined and message.reasoning_content is not none %}
|
| 32 |
+
{%- set reasoning_content = message.reasoning_content %}
|
| 33 |
+
{%- else %}
|
| 34 |
+
{%- if '</think>' in message.content %}
|
| 35 |
+
{%- set content = message.content.split('</think>')[-1].lstrip('\n') %}
|
| 36 |
+
{%- set reasoning_content = message.content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
|
| 37 |
+
{%- endif %}
|
| 38 |
+
{%- endif %}
|
| 39 |
+
{%- if loop.index0 > ns.last_query_index %}
|
| 40 |
+
{%- if loop.last or (not loop.last and reasoning_content) %}
|
| 41 |
+
{{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content.strip('\n') + '\n</think>\n\n' + content.lstrip('\n') }}
|
| 42 |
+
{%- else %}
|
| 43 |
+
{{- '<|im_start|>' + message.role + '\n' + content }}
|
| 44 |
+
{%- endif %}
|
| 45 |
+
{%- else %}
|
| 46 |
+
{{- '<|im_start|>' + message.role + '\n' + content }}
|
| 47 |
+
{%- endif %}
|
| 48 |
+
{%- if message.tool_calls %}
|
| 49 |
+
{%- for tool_call in message.tool_calls %}
|
| 50 |
+
{%- if (loop.first and content) or (not loop.first) %}
|
| 51 |
+
{{- '\n' }}
|
| 52 |
+
{%- endif %}
|
| 53 |
+
{%- if tool_call.function %}
|
| 54 |
+
{%- set tool_call = tool_call.function %}
|
| 55 |
+
{%- endif %}
|
| 56 |
+
{{- '<tool_call>\n{"name": "' }}
|
| 57 |
+
{{- tool_call.name }}
|
| 58 |
+
{{- '", "arguments": ' }}
|
| 59 |
+
{%- if tool_call.arguments is string %}
|
| 60 |
+
{{- tool_call.arguments }}
|
| 61 |
+
{%- else %}
|
| 62 |
+
{{- tool_call.arguments | tojson }}
|
| 63 |
+
{%- endif %}
|
| 64 |
+
{{- '}\n</tool_call>' }}
|
| 65 |
+
{%- endfor %}
|
| 66 |
+
{%- endif %}
|
| 67 |
+
{{- '<|im_end|>\n' }}
|
| 68 |
+
{%- elif message.role == "tool" %}
|
| 69 |
+
{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
|
| 70 |
+
{{- '<|im_start|>user' }}
|
| 71 |
+
{%- endif %}
|
| 72 |
+
{{- '\n<tool_response>\n' }}
|
| 73 |
+
{{- message.content }}
|
| 74 |
+
{{- '\n</tool_response>' }}
|
| 75 |
+
{%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
|
| 76 |
+
{{- '<|im_end|>\n' }}
|
| 77 |
+
{%- endif %}
|
| 78 |
+
{%- endif %}
|
| 79 |
+
{%- endfor %}
|
| 80 |
+
{%- if add_generation_prompt %}
|
| 81 |
+
{{- '<|im_start|>assistant\n' }}
|
| 82 |
+
{%- if enable_thinking is defined and enable_thinking is false %}
|
| 83 |
+
{{- '<think>\n\n</think>\n\n' }}
|
| 84 |
+
{%- endif %}
|
| 85 |
+
{%- endif %}
|
codec.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:74fc41c5a7151c6f350af8bd7e5d6e3accfcc7f3dfbfac23afd35af07052bb2f
|
| 3 |
+
size 1871099728
|
config.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"attention_o_bias": false,
|
| 3 |
+
"attention_qk_norm": true,
|
| 4 |
+
"attention_qkv_bias": false,
|
| 5 |
+
"attention_use_flex": false,
|
| 6 |
+
"attention_use_varlen": true,
|
| 7 |
+
"audio_embed_dim": 2560,
|
| 8 |
+
"codebook_size": 4096,
|
| 9 |
+
"dim": 2560,
|
| 10 |
+
"dropout": 0.0,
|
| 11 |
+
"fast_attention_o_bias": false,
|
| 12 |
+
"fast_attention_qk_norm": false,
|
| 13 |
+
"fast_attention_qkv_bias": false,
|
| 14 |
+
"fast_dim": 2560,
|
| 15 |
+
"fast_head_dim": 128,
|
| 16 |
+
"fast_intermediate_size": 9728,
|
| 17 |
+
"fast_n_head": 32,
|
| 18 |
+
"fast_n_local_heads": 8,
|
| 19 |
+
"head_dim": 128,
|
| 20 |
+
"initializer_range": 0.01976423537605237,
|
| 21 |
+
"intermediate_size": 9728,
|
| 22 |
+
"is_reward_model": false,
|
| 23 |
+
"max_seq_len": 4096,
|
| 24 |
+
"model_type": "dual_ar",
|
| 25 |
+
"n_fast_layer": 4,
|
| 26 |
+
"n_head": 32,
|
| 27 |
+
"n_layer": 36,
|
| 28 |
+
"n_local_heads": 8,
|
| 29 |
+
"norm_eps": 1e-06,
|
| 30 |
+
"norm_fastlayer_input": true,
|
| 31 |
+
"num_codebooks": 10,
|
| 32 |
+
"rope_base": 1000000,
|
| 33 |
+
"scale_codebook_embeddings": true,
|
| 34 |
+
"semantic_begin_id": 151678,
|
| 35 |
+
"semantic_end_id": 155773,
|
| 36 |
+
"tie_word_embeddings": false,
|
| 37 |
+
"use_gradient_checkpointing": true,
|
| 38 |
+
"vocab_size": 155776
|
| 39 |
+
}
|
infer.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Run the full merged model through the pinned Fish Speech CLI."""
|
| 2 |
+
import argparse
|
| 3 |
+
import os
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
import subprocess
|
| 6 |
+
import sys
|
| 7 |
+
|
| 8 |
+
def main():
|
| 9 |
+
p = argparse.ArgumentParser(description="Nino V2 full merged TTS; no adapter loading")
|
| 10 |
+
p.add_argument("--text", required=True)
|
| 11 |
+
p.add_argument("--reference", default="g1_ni_00016")
|
| 12 |
+
p.add_argument("--output", type=Path, default=Path("nino.wav"))
|
| 13 |
+
p.add_argument("--device", default="cuda")
|
| 14 |
+
p.add_argument("--seed", type=int, default=42)
|
| 15 |
+
p.add_argument("--temperature", type=float, default=0.7)
|
| 16 |
+
p.add_argument("--top-p", type=float, default=0.7)
|
| 17 |
+
p.add_argument("--top-k", type=int, default=30)
|
| 18 |
+
p.add_argument("--max-new-tokens", type=int, default=1024)
|
| 19 |
+
a = p.parse_args()
|
| 20 |
+
root = Path(__file__).resolve().parent
|
| 21 |
+
if Path(a.reference).name != a.reference:
|
| 22 |
+
p.error("--reference must be a bundled filename stem")
|
| 23 |
+
ref = root / "references" / a.reference
|
| 24 |
+
text = ref.with_suffix(".txt")
|
| 25 |
+
tokens = ref.with_suffix(".npy")
|
| 26 |
+
for path in (root/"model.safetensors", root/"codec.pth", root/"config.json", text, tokens):
|
| 27 |
+
if not path.is_file():
|
| 28 |
+
p.error(f"Required file missing: {path}")
|
| 29 |
+
if not a.text.strip() or not 0 < a.top_p <= 1 or a.temperature <= 0 or a.top_k < 1 or a.max_new_tokens < 1:
|
| 30 |
+
p.error("Empty text or invalid sampling parameters")
|
| 31 |
+
output = a.output.expanduser().resolve()
|
| 32 |
+
if output.suffix.lower() != ".wav":
|
| 33 |
+
p.error("--output must end in .wav")
|
| 34 |
+
output.parent.mkdir(parents=True, exist_ok=True)
|
| 35 |
+
command = [
|
| 36 |
+
sys.executable, "-m", "fish_speech.models.text2semantic.inference",
|
| 37 |
+
"--checkpoint-path", str(root), "--text", a.text,
|
| 38 |
+
"--prompt-text", text.read_text(encoding="utf-8").strip(),
|
| 39 |
+
"--prompt-tokens", str(tokens), "--output", str(output),
|
| 40 |
+
"--output-dir", str(output.parent/(output.stem+"_codes")),
|
| 41 |
+
"--num-samples", "1", "--device", a.device, "--seed", str(a.seed),
|
| 42 |
+
"--temperature", str(a.temperature), "--top-p", str(a.top_p),
|
| 43 |
+
"--top-k", str(a.top_k), "--max-new-tokens", str(a.max_new_tokens),
|
| 44 |
+
"--chunk-length", "200", "--iterative-prompt", "--no-compile", "--no-half",
|
| 45 |
+
]
|
| 46 |
+
env = dict(os.environ, PYTHONIOENCODING="utf-8", PYTHONDONTWRITEBYTECODE="1")
|
| 47 |
+
result = subprocess.run(command, env=env, check=False)
|
| 48 |
+
if result.returncode:
|
| 49 |
+
raise SystemExit(result.returncode)
|
| 50 |
+
if not output.is_file() or output.stat().st_size <= 44:
|
| 51 |
+
raise SystemExit("Inference returned without saving a nonempty WAV")
|
| 52 |
+
print(f"Saved: {output}")
|
| 53 |
+
|
| 54 |
+
if __name__ == "__main__":
|
| 55 |
+
main()
|
model.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7369addacafdb3afba60fa5854941d8147ead186681fbf5d675a098077361c5c
|
| 3 |
+
size 9921316568
|
references/g1_ni_00016.npy
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7871d6fccc1acdb5723942ab08c0dc8877abf663ed899eaf2881bd564a4c6935
|
| 3 |
+
size 12528
|
references/g1_ni_00016.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
パパが管理を任せている人たちがいるの。年に何回か設備の点検や掃除に来てるらしいわ。
|
references/g1_ni_00016.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:90cb0ccfffa42be112c3057fee7330678cee41304923d504e09a1ef594f51b76
|
| 3 |
+
size 634958
|
special_tokens_map.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
tokenizer.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f24e08099d45a8adf3f52f5f0b03276e433bb9d689bb15fcbcc48ce58744588b
|
| 3 |
+
size 12217872
|
tokenizer_config.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|