YarnGPT 是一款专为合成尼日利亚口音英语而设计的文本转语音(TTS)模型,采用纯语言建模技术,可为多样化应用提供高质量、自然且文化相关的语音合成。
下载量 124
发布时间 : 12/31/2024
模型介绍
内容详情
替代品
模型简介
YarnGPT 是一款基于语言建模的文本转语音模型,专门设计用于生成尼日利亚口音的英语语音。它无需外部适配器或复杂架构,支持约11种不同声音(6男5女)。
模型特点
尼日利亚口音支持
专门优化用于生成自然流畅的尼日利亚口音英语语音
多声音支持
提供11种不同声音选择(6男5女),满足多样化需求
纯语言建模技术
无需外部适配器或复杂架构,简化部署流程
文化相关性
语音输出具有文化相关性,适合尼日利亚本地应用场景
模型能力
文本转语音
尼日利亚口音英语合成
多声音选择
长文本语音合成
使用案例
媒体与娱乐
新闻播报
生成具有尼日利亚口音的新闻播报语音
自然流畅的新闻播报效果
教育
教育内容朗读
为教育内容生成本地化语音
提高尼日利亚学生的学习体验
客户服务
IVR系统语音
为尼日利亚地区的客户服务系统生成语音提示
更亲切的本地化客户体验
库名称:transformers
许可证:apache-2.0
语言:
- 英语
基础模型: - HuggingFaceTB/SmolLM2-360M
流水线标签:文本转语音
YarnGPT
目录
模型概述
YarnGPT 是一款专为合成尼日利亚口音英语而设计的文本转语音(TTS)模型,采用纯语言建模技术,无需外部适配器或复杂架构,可为多样化应用提供高质量、自然且文化相关的语音合成。
<视频 宽度="600" 控制>
<源 src="https://huggingface.co/saheedniyi/YarnGPT/resolve/main/audio/YearnGPT.mp4" 类型="视频/mp4">
您的浏览器不支持视频标签。
</视频>
使用方法(Colab)
该模型可独立生成音频,但建议使用语音提示模型,默认支持约11种声音(6男5女):
- zainab
- jude
- tayo
- remi
- idera(默认及最佳声音)
- regina
- chinenye
- umar
- osagie
- joke
- emma(名字与任何部落或口音无关)
提示 YarnGPT
# 克隆 YarnGPT 仓库以获取 `audiotokenizer`
!git clone https://github.com/saheedniyi02/yarngpt.git
# 安装必要库
!pip install outetts==0.2.3 uroman
# 导入重要包
import os
import re
import json
import torch
import inflect
import random
import uroman as ur
import numpy as np
import torchaudio
import IPython
from transformers import AutoModelForCausalLM, AutoTokenizer
from outetts.wav_tokenizer.decoder import WavTokenizer
from yarngpt.audiotokenizer import AudioTokenizer
# 下载 wavtokenizer 权重及配置(用于编码和解码音频)
!wget https://huggingface.co/novateur/WavTokenizer-medium-speech-75token/resolve/main/wavtokenizer_mediumdata_frame75_3s_nq1_code4096_dim512_kmeans200_attn.yaml
!gdown 1-ASeEkrn4HY49yZWHTASgfGFNXdVnLTt
# 模型路径及 wavtokenizer 权重路径(假设基于 Google Colab,不同环境可能保存至不同位置)
hf_path="saheedniyi/YarnGPT"
wav_tokenizer_config_path="/content/wavtokenizer_mediumdata_frame75_3s_nq1_code4096_dim512_kmeans200_attn.yaml"
wav_tokenizer_model_path = "/content/wavtokenizer_large_speech_320_24k.ckpt"
# 创建 AudioTokenizer 对象
audio_tokenizer=AudioTokenizer(
hf_path,wav_tokenizer_model_path,wav_tokenizer_config_path
)
# 加载模型权重
model = AutoModelForCausalLM.from_pretrained(hf_path,torch_dtype="auto").to(audio_tokenizer.device)
# 输入文本
text="嗯,那么,你最新项目的灵感是什么?比如,是否有某个特定时刻让你觉得‘就是它了!’还是说,呃,随着时间的推移自然而然地成型了?"
# 创建提示,可选 `speaker_name` 参数,可选声音为 "idera","emma","jude","osagie","tayo","zainab","joke","regina","remi","umar","chinenye",未选择则随机
prompt=audio_tokenizer.create_prompt(text,"idera")
# 标记化提示
input_ids=audio_tokenizer.tokenize_prompt(prompt)
# 从模型生成输出,可调整 `.generate` 参数
output = model.generate(
input_ids=input_ids,
temperature=0.1,
repetition_penalty=1.1,
max_length=4000,
)
# 将输出转换为“音频代码”
codes=audio_tokenizer.get_codes(output)
# 将代码转换为音频
audio=audio_tokenizer.get_audio(codes)
# 播放音频
IPython.display.Audio(audio,rate=24000)
# 保存音频
torchaudio.save(f"audio.wav", audio, sample_rate=24000)
简易尼日利亚口音新闻播报
!git clone https://github.com/saheedniyi02/yarngpt.git
# 安装必要库
!pip install outetts uroman trafilatura pydub
import os
import re
import json
import torch
import inflect
import random
import requests
import trafilatura
import inflect
import uroman as ur
import numpy as np
import torchaudio
import IPython
from pydub import AudioSegment
from pydub.effects import normalize
from transformers import AutoModelForCausalLM, AutoTokenizer
from outetts.wav_tokenizer.decoder import WavTokenizer
!wget https://huggingface.co/novateur/WavTokenizer-medium-speech-75token/resolve/main/wavtokenizer_mediumdata_frame75_3s_nq1_code4096_dim512_kmeans200_attn.yaml
!gdown 1-ASeEkrn4HY49yZWHTASgfGFNXdVnLTt
from yarngpt.audiotokenizer import AudioTokenizer
tokenizer_path="saheedniyi/YarnGPT"
wav_tokenizer_config_path="/content/wavtokenizer_mediumdata_frame75_3s_nq1_code4096_dim512_kmeans200_attn.yaml"
wav_tokenizer_model_path = "/content/wavtokenizer_large_speech_320_24k.ckpt"
audio_tokenizer=AudioTokenizer(
tokenizer_path,wav_tokenizer_model_path,wav_tokenizer_config_path
)
model = AutoModelForCausalLM.from_pretrained(tokenizer_path,torch_dtype="auto").to(audio_tokenizer.device)
def split_text_into_chunks(text, word_limit=25):
"""
将长文本分割为合理块
"""
sentences=[sentence.strip() for sentence in text.split('.') if sentence.strip()]
chunks=[]
for sentence in sentences:
chunks.append(".")
sentence_splitted=sentence.split(" ")
num_words=len(sentence_splitted)
start_index=0
if num_words>word_limit:
while start_index<num_words:
end_index=min(num_words,start_index+word_limit)
chunks.append(" ".join(sentence_splitted[start_index:start_index+word_limit]))
start_index=end_index
else:
chunks.append(sentence)
return chunks
# 提取网页内容
page=requests.get("https://punchng.com/expensive-feud-how-burna-boy-cubana-chief-priests-fight-led-to-dollar-rain/")
content=trafilatura.extract(page.text)
chunks=split_text_into_chunks(content)
# 遍历块并创建大型 `all_codes` 列表
all_codes=[]
for i,chunk in enumerate(chunks):
print(i)
print("\n")
print(chunk)
if chunk==".":
# 遇到句号添加0.25秒静音
all_codes.extend([453]*20)
else:
prompt=audio_tokenizer.create_prompt(chunk,"chinenye")
input_ids=audio_tokenizer.tokenize_prompt(prompt)
output = model.generate(
input_ids=input_ids,
temperature=0.1,
repetition_penalty=1.1,
max_length=4000,
)
codes=audio_tokenizer.get_codes(output)
all_codes.extend(codes)
# 转换为音频
audio=audio_tokenizer.get_audio(all_codes)
IPython.display.Audio(audio,rate=24000)
torchaudio.save(f"news1.wav", audio, sample_rate=24000)
模型描述
- 开发者: Saheedniyi
- 模型类型: 文本转语音
- 语言(NLP): 英语 → 尼日利亚口音英语
- 微调自: HuggingFaceTB/SmolLM2-360M
- 仓库: YarnGPT GitHub 仓库
- 论文: 进行中
- 演示: 1) 提示 YarnGPT 笔记本
2) 简易新闻播报
用途
为实验目的生成尼日利亚口音英语语音。
超出范围用途
该模型不适合生成英语以外的语言或其他口音的语音。
偏见、风险与限制
该模型可能无法完全捕捉尼日利亚口音的多样性,并可能因训练数据集而表现出偏见。此外,许多训练文本是自动生成的,可能影响性能。
建议
用户(直接或下游)应了解模型的偏见、风险和限制。鼓励反馈和多样化的训练数据贡献。
语音样本
聆听 YarnGPT 生成的样本:
输入 | 音频 | 备注 |
---|---|---|
大家好!我是 Saheed Azeez,很高兴宣布这个项目的发布。过去两个月我一直在收集数据并学习如何构建基于音频的模型,感谢上帝,我终于有所成果。 | (temperature=0.1, repetition_penalty=1.1),声音:idera | |
Wizkid、Davido、Burna Boy 在拉各斯同台演出。此活动在社交媒体上引发热议,粉丝和评论家均赞扬艺术家们的表演及三位音乐巨匠同台的罕见机会。 | (temperature=0.1, repetition_penalty=1.1),声音:jude | |
自1963年尼日利亚成为共和国以来,已有14人担任国家元首,现任总统 Bola Tinubu 是第16位。 |