🚀 Kartoffel-3B (基於Orpheus-3B) - 自然版
Kartoffel-3B是一個基於Orpheus-3B的德語文本轉語音(TTS)模型家族。它有自然和合成兩個版本,能生成多種音色和情感的語音,為德語語音合成提供了豐富的選擇。

🚀 快速開始
✨ 主要特性
- 多版本選擇:提供自然和合成兩個版本,滿足不同場景需求。
- 多音色支持:模型可以使用預定義的多種音色生成語音。
- 多樣情感表達:能夠根據輸入文本生成不同情感基調和表達方式的語音。
📦 安裝指南
文檔未提供安裝步驟,暫無法展示。
💻 使用示例
基礎用法
import torch
import torchaudio.transforms as T
import os
import torch
from snac import SNAC
from peft import PeftModel
import soundfile as sf
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"SebastianBodza/Kartoffel_Orpheus-3B_german_synthetic-v0.1",
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained(
"SebastianBodza/Kartoffel_Orpheus-3B_german_synthetic-v0.1",
)
snac_model = SNAC.from_pretrained("hubertsiuzdak/snac_24khz")
snac_model = snac_model.to("cuda")
chosen_voice = "Julian"
prompts = [
'Tief im verwunschenen Wald, wo die Bäume uralte Geheimnisse flüsterten, lebte ein kleiner Gnom namens Fips, der die Sprache der Tiere verstand.',
]
def process_single_prompt(prompt, chosen_voice):
if chosen_voice == "in_prompt" or chosen_voice == "":
full_prompt = prompt
else:
full_prompt = f"{chosen_voice}: {prompt}"
start_token = torch.tensor([[128259]], dtype=torch.int64)
end_tokens = torch.tensor([[128009, 128260]], dtype=torch.int64)
input_ids = tokenizer(full_prompt, return_tensors="pt").input_ids
modified_input_ids = torch.cat([start_token, input_ids, end_tokens], dim=1)
input_ids = modified_input_ids.to("cuda")
attention_mask = torch.ones_like(input_ids)
generated_ids = model.generate(
input_ids=input_ids,
attention_mask=attention_mask,
max_new_tokens=4000,
do_sample=True,
temperature=0.6,
top_p=0.95,
repetition_penalty=1.1,
num_return_sequences=1,
eos_token_id=128258,
use_cache=True,
)
token_to_find = 128257
token_to_remove = 128258
token_indices = (generated_ids == token_to_find).nonzero(as_tuple=True)
if len(token_indices[1]) > 0:
last_occurrence_idx = token_indices[1][-1].item()
cropped_tensor = generated_ids[:, last_occurrence_idx + 1 :]
else:
cropped_tensor = generated_ids
masked_row = cropped_tensor[0][cropped_tensor[0] != token_to_remove]
row_length = masked_row.size(0)
new_length = (row_length // 7) * 7
trimmed_row = masked_row[:new_length]
code_list = [t - 128266 for t in trimmed_row]
return code_list
def redistribute_codes(code_list):
layer_1 = []
layer_2 = []
layer_3 = []
for i in range((len(code_list) + 1) // 7):
layer_1.append(code_list[7 * i])
layer_2.append(code_list[7 * i + 1] - 4096)
layer_3.append(code_list[7 * i + 2] - (2 * 4096))
layer_3.append(code_list[7 * i + 3] - (3 * 4096))
layer_2.append(code_list[7 * i + 4] - (4 * 4096))
layer_3.append(code_list[7 * i + 5] - (5 * 4096))
layer_3.append(code_list[7 * i + 6] - (6 * 4096))
codes = [
torch.tensor(layer_1).unsqueeze(0),
torch.tensor(layer_2).unsqueeze(0),
torch.tensor(layer_3).unsqueeze(0),
]
codes = [c.to("cuda") for c in codes]
audio_hat = snac_model.decode(codes)
return audio_hat
for i, prompt in enumerate(prompts):
print(f"Processing prompt {i + 1}/{len(prompts)}")
with torch.no_grad():
code_list = process_single_prompt(prompt, chosen_voice)
samples = redistribute_codes(code_list)
audio_numpy = samples.detach().squeeze().to("cpu").numpy()
sf.write(f"output_{i}.wav", audio_numpy, 24000)
print(f"Saved output_{i}.wav")
📚 詳細文檔
模型概述
這是一個基於Orpheus-3B的德語文本轉語音(TTS)模型家族。
有兩個主要版本:
- Kartoffel-3B-自然版:主要在自然人類語音錄音上進行微調,旨在實現逼真的語音效果。數據集基於高質量的德語音頻,包括許可的播客、講座和其他開放教育資源(OER)數據,並通過Emilia風格的管道進行處理。
- Kartoffel-3B-合成版:使用合成語音數據進行微調,具有情感和不同的語調。數據集包含4種不同說話者的多種情感。
目前這是自然版,用於生成自然聽起來的語音。
兩個版本都支持:
- 多說話者:模型可以使用預定義說話者的各種身份生成語音。
- 多樣表達:能夠根據輸入文本生成具有不同情感基調和表達方式的語音。自然版對錶達和情感的支持有限。
自然版可用的說話者和表達
說話者
有幾個說話者,但並非所有說話者都穩定。因此,我只列出至少部分穩定的說話者:
- 男性:Jakob、Anton、Julian、Jan、Alexander、Emil、Ben、Elias、Felix、Jonas、Noah、Maximilian
- 女性:Sophie、Marie、Mia、Maria、Sophia、Lina、Lea
不幸的是,數據集中男性說話者比女性說話者多得多。此外,並非所有說話者都能被重建,並且可能存在重複。性別估計的效果也不太好。
📄 許可證
本模型使用的許可證為llama3.2。
信息表格
屬性 |
詳情 |
庫名稱 |
transformers |
標籤 |
unsloth、text-to-speech、tts、german、orpheus |
語言 |
德語 |
基礎模型 |
amuvarma/3b-de-pretrain、canopylabs/orpheus-3b-0.1-ft |
許可證 |
llama3.2 |