Fish-Speech-1.5在Python环境下的部署与调用指南
想给你的应用加上自然流畅的语音合成功能吗?Fish-Speech-1.5是个不错的选择。它支持十几种语言,生成的声音听起来很自然,而且部署起来也不算复杂。今天我就带你一步步在Python环境里把它跑起来,从安装到调用,把可能遇到的坑都提前告诉你。
1. 先了解下Fish-Speech-1.5
Fish-Speech-1.5是个开源的文本转语音模型,简单说就是能把文字变成人说的话。它有几个特点挺吸引人的:
- 多语言支持:能处理英语、中文、日语、韩语等13种语言,对中文的支持尤其不错。
- 声音自然:生成的声音不像传统机器人那样生硬,听起来更像真人说话,有自然的停顿和语气变化。
- 零样本语音克隆:如果你有一段10到30秒的参考音频,它就能模仿那个声音风格来合成新的语音,不需要额外训练。
- 部署友好:提供了Python接口,方便集成到各种应用里。
这个模型在Hugging Face上可以直接下载,官方也提供了详细的文档。接下来我们就开始动手部署。
2. 环境准备与依赖安装
在开始写代码调用模型之前,得先把环境搭好。我建议用虚拟环境,这样不会跟你系统里其他的Python项目冲突。
2.1 创建虚拟环境
打开你的终端或者命令行工具,执行下面的命令来创建并激活一个虚拟环境。我用的是venv,你也可以用conda,看个人习惯。
# 创建虚拟环境,名字叫fish-speech-env python -m venv fish-speech-env # 激活虚拟环境 # 在Windows上: fish-speech-env\Scripts\activate # 在Linux或macOS上: source fish-speech-env/bin/activate激活后,你的命令行提示符前面应该会显示(fish-speech-env),表示已经在虚拟环境里了。
2.2 安装PyTorch
Fish-Speech依赖PyTorch,而且最好用GPU版本,这样合成速度会快很多。先去PyTorch官网看看,根据你的CUDA版本选择安装命令。如果你没有GPU或者CUDA,就用CPU版本,不过速度会慢一些。
假设你的CUDA版本是11.8,可以这样安装:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果只用CPU,就这样:
pip install torch torchvision torchaudio安装完可以验证下:
import torch print(torch.__version__) print(torch.cuda.is_available()) # 如果是True,说明GPU可用2.3 安装Fish-Speech和其他依赖
接下来安装Fish-Speech的Python包和它需要的其他库。
# 安装fish-speech pip install fish-speech # 安装一些可能需要的额外依赖 pip install transformers accelerate sentencepiece protobuftransformers和accelerate是Hugging Face的库,用来加载和运行模型。sentencepiece是分词器需要的,protobuf是协议缓冲区,有些模型文件会用到。
如果安装过程中遇到问题,比如某个包版本冲突,可以尝试指定版本号,或者先升级下pip:
pip install --upgrade pip3. 下载模型文件
模型文件有点大,大概几个GB,所以需要点时间和网络空间。Fish-Speech-1.5的模型在Hugging Face上,我们可以用代码自动下载,也可以手动下载。
3.1 自动下载(推荐)
最简单的方法就是让代码自己下载。当你第一次运行加载模型的代码时,它会自动从Hugging Face下载需要的文件,并缓存到本地。不过你得确保网络能访问Hugging Face。
3.2 手动下载(如果自动下载慢)
如果自动下载太慢或者经常中断,可以手动去Hugging Face页面下载。模型地址是:fishaudio/fish-speech-1.5。
你需要下载的主要文件包括:
- 模型权重文件(通常是
.bin或.safetensors格式) - 配置文件(
config.json) - 分词器文件(
tokenizer.json等)
下载后放到一个本地文件夹里,比如./models/fish-speech-1.5,然后在代码里指定这个路径就行。
4. 基础调用:文本转语音
环境准备好了,模型也下载了,现在来写第一个语音合成程序。我们从最简单的开始:输入一段文字,让它生成语音。
4.1 初始化模型和处理器
首先,我们需要加载模型和对应的处理器。处理器负责把文本转换成模型能理解的格式。
from fish_speech.models.text_to_speech.tts import TTS from transformers import AutoProcessor import torch # 检查是否有GPU可用 device = "cuda" if torch.cuda.is_available() else "cpu" print(f"使用设备: {device}") # 加载处理器 processor = AutoProcessor.from_pretrained("fishaudio/fish-speech-1.5") # 加载TTS模型 model = TTS.from_pretrained("fishaudio/fish-speech-1.5").to(device) model.eval() # 设置为评估模式第一次运行这段代码时,它会下载模型文件,可能需要等一会儿。如果你已经手动下载了模型,可以把from_pretrained的参数换成你的本地路径,比如"./models/fish-speech-1.5"。
4.2 生成语音
现在用这个模型来合成一段语音。我们试试中文和英文。
def text_to_speech(text, language="zh", output_file="output.wav"): """ 将文本转换为语音并保存为WAV文件 参数: text: 要转换的文本 language: 语言代码,zh-中文, en-英文, ja-日文等 output_file: 输出的音频文件名 """ # 准备输入 inputs = processor( text=text, language=language, return_tensors="pt" ).to(device) # 生成语音 with torch.no_grad(): # 不计算梯度,节省内存 generated = model.generate( inputs["input_ids"], attention_mask=inputs.get("attention_mask"), max_new_tokens=500, # 最大生成token数,控制语音长度 do_sample=True, # 使用采样,让输出更多样 temperature=0.7, # 温度参数,控制随机性 ) # 提取音频数据 audio = generated[0].cpu().numpy() # 保存为WAV文件 # 注意:这里需要根据实际的音频采样率来保存 # 假设采样率是24000Hz import soundfile as sf sf.write(output_file, audio, 24000) print(f"语音已保存到: {output_file}") return output_file # 试试中文 text_to_speech( "你好,欢迎使用Fish-Speech语音合成系统。这是一个测试示例。", language="zh", output_file="hello_chinese.wav" ) # 试试英文 text_to_speech( "Hello, this is a test of the Fish-Speech text-to-speech system.", language="en", output_file="hello_english.wav" )运行这段代码,你会在当前目录下得到两个WAV文件。用播放器打开听听,应该能听到比较自然的语音。
4.3 控制语音参数
你可能会觉得生成的声音太单调,想调整下语速、音调什么的。Fish-Speech支持一些控制参数,让语音更有表现力。
def text_to_speech_with_control(text, language="zh", speed=1.0, output_file="output.wav"): """ 带参数控制的文本转语音 参数: text: 要转换的文本 language: 语言代码 speed: 语速,1.0是正常,大于1.0更快,小于1.0更慢 output_file: 输出的音频文件名 """ # 可以在文本中加入控制标记 # 比如加入情感标记:(excited) 兴奋的 controlled_text = f"(excited) {text}" inputs = processor( text=controlled_text, language=language, return_tensors="pt" ).to(device) with torch.no_grad(): generated = model.generate( inputs["input_ids"], attention_mask=inputs.get("attention_mask"), max_new_tokens=500, do_sample=True, temperature=0.7, # 可以尝试调节生成参数来影响语速 repetition_penalty=1.1, # 重复惩罚,避免重复 ) audio = generated[0].cpu().numpy() # 如果需要调整语速,可以在保存时处理 # 但更简单的方法是在生成时通过控制文本实现 import soundfile as sf sf.write(output_file, audio, 24000) print(f"语音已保存到: {output_file}") return output_file # 试试带情感的语音 text_to_speech_with_control( "太棒了!我们成功了!", language="zh", output_file="excited.wav" )Fish-Speech支持很多情感标记,比如(sad)悲伤的、(angry)生气的、(whispering)耳语的等等。你可以在文本开头加上这些标记,模型就会尝试用对应的情感来合成语音。
5. 进阶功能:语音克隆
Fish-Speech一个很酷的功能是语音克隆。你给它一段参考音频,它就能模仿那个声音来说新的话。这对做虚拟助手、有声书什么的特别有用。
5.1 准备参考音频
首先,你需要一段参考音频,最好是10到30秒,清晰的人声,背景噪音少。格式可以是WAV、MP3等常见格式。
import librosa import numpy as np def prepare_reference_audio(audio_path, target_sr=24000): """ 准备参考音频 参数: audio_path: 音频文件路径 target_sr: 目标采样率,Fish-Speech通常用24000Hz 返回: 处理后的音频数组 """ # 加载音频 audio, sr = librosa.load(audio_path, sr=target_sr) # 可选:做一些预处理,比如降噪、归一化 # 简单的归一化 audio = audio / np.max(np.abs(audio)) * 0.9 return audio # 加载参考音频 reference_audio = prepare_reference_audio("reference.wav") print(f"参考音频长度: {len(reference_audio)/24000:.2f}秒")5.2 进行语音克隆
有了参考音频,现在可以让模型用这个声音来说新的话了。
def voice_cloning(reference_audio, text, language="zh", output_file="cloned.wav"): """ 语音克隆:用参考音频的声音说新的话 参数: reference_audio: 参考音频数据 text: 要说的新文本 language: 语言代码 output_file: 输出文件名 """ # 确保参考音频是torch tensor格式 if not isinstance(reference_audio, torch.Tensor): reference_audio = torch.tensor(reference_audio).unsqueeze(0).to(device) # 准备文本输入 inputs = processor( text=text, language=language, return_tensors="pt" ).to(device) # 进行语音克隆 with torch.no_grad(): generated = model.generate( inputs["input_ids"], attention_mask=inputs.get("attention_mask"), max_new_tokens=500, do_sample=True, temperature=0.7, # 传入参考音频 reference_audio=reference_audio, ) audio = generated[0].cpu().numpy() import soundfile as sf sf.write(output_file, audio, 24000) print(f"克隆语音已保存到: {output_file}") return output_file # 使用示例 # 假设reference_audio是之前加载的参考音频 voice_cloning( reference_audio, "大家好,我是新来的语音助手,很高兴为大家服务。", language="zh", output_file="assistant.wav" )这个功能挺强大的,但效果好坏很大程度上取决于参考音频的质量。如果参考音频背景噪音大,或者说话人声音不稳定,克隆效果可能会打折扣。
6. 常见问题与解决
在实际部署和调用过程中,你可能会遇到一些问题。这里我整理了几个常见的,并给出解决方法。
6.1 内存不足问题
Fish-Speech-1.5模型比较大,如果GPU内存不够,可能会报内存错误。
解决方法:
使用CPU模式:如果没有GPU或者GPU内存太小,可以强制使用CPU。虽然慢,但能跑起来。
device = "cpu"减少批处理大小:如果你一次处理很多文本,可以减少批处理大小。
# 一次只处理一个 inputs = processor(text=texts[0], ...)使用内存优化:PyTorch有一些内存优化选项。
# 在模型加载后设置 model = model.half() # 使用半精度,减少内存占用
6.2 生成语音不自然
有时候生成的语音可能听起来怪怪的,比如语调不对、断句奇怪。
解决方法:
调整温度参数:
temperature控制随机性。值越小越确定,值越大越随机。通常0.6到0.9之间效果比较好。generated = model.generate(..., temperature=0.8, ...)使用重复惩罚:避免模型重复说同样的词。
generated = model.generate(..., repetition_penalty=1.2, ...)检查文本格式:确保文本里没有特殊字符或格式问题。中文最好用纯文本,不要有HTML标签什么的。
6.3 多语言混合问题
如果你想在一段话里混合多种语言,比如中英文混合,可能会遇到发音不准的问题。
解决方法:
按语言分段处理:把不同语言的部分分开,分别合成,然后再拼接。
# 中文部分 audio_chinese = synthesize("你好,") # 英文部分 audio_english = synthesize("hello", language="en") # 拼接音频 final_audio = np.concatenate([audio_chinese, audio_english])使用主要语言:如果混合不多,可以用主要语言来合成,模型可能会自动处理。
6.4 长时间语音合成
如果需要合成很长的文本,比如整篇文章,直接合成可能会出问题。
解决方法:
分段合成:把长文本分成小段,每段单独合成,再拼接起来。
def synthesize_long_text(long_text, max_length=100): """合成长文本""" segments = [] # 简单按标点分段 import re parts = re.split(r'[。!?.!?]', long_text) audios = [] for part in parts: if len(part.strip()) > 0: audio = synthesize(part.strip()) audios.append(audio) # 拼接所有音频 final_audio = np.concatenate(audios) return final_audio控制生成长度:通过
max_new_tokens参数控制每段的最大长度。
7. 实际应用示例
了解了基本用法后,我们来看几个实际的应用场景,把Fish-Speech集成到具体的项目里。
7.1 简单的语音助手
我们可以用Fish-Speech做一个简单的语音助手,把文字回复转换成语音。
class SimpleVoiceAssistant: def __init__(self, model_path="fishaudio/fish-speech-1.5"): """初始化语音助手""" self.device = "cuda" if torch.cuda.is_available() else "cpu" self.processor = AutoProcessor.from_pretrained(model_path) self.model = TTS.from_pretrained(model_path).to(self.device) self.model.eval() def respond(self, text_response, language="zh"): """生成语音回复""" inputs = self.processor( text=text_response, language=language, return_tensors="pt" ).to(self.device) with torch.no_grad(): generated = self.model.generate( inputs["input_ids"], attention_mask=inputs.get("attention_mask"), max_new_tokens=300, do_sample=True, temperature=0.7, ) audio = generated[0].cpu().numpy() return audio def save_response(self, text_response, filename="response.wav"): """保存语音回复到文件""" audio = self.respond(text_response) import soundfile as sf sf.write(filename, audio, 24000) print(f"回复已保存到: {filename}") return filename # 使用示例 assistant = SimpleVoiceAssistant() assistant.save_response( "现在是下午三点,今天天气晴朗,气温25度。", "weather_report.wav" )7.2 批量处理文本文件
如果你有很多文本需要转换成语音,可以写个批量处理的脚本。
import os import json def batch_text_to_speech(input_dir, output_dir, language="zh"): """ 批量处理文本文件为语音 参数: input_dir: 输入目录,包含txt文件 output_dir: 输出目录,保存WAV文件 language: 语言代码 """ # 确保输出目录存在 os.makedirs(output_dir, exist_ok=True) # 初始化模型(只初始化一次,提高效率) device = "cuda" if torch.cuda.is_available() else "cpu" processor = AutoProcessor.from_pretrained("fishaudio/fish-speech-1.5") model = TTS.from_pretrained("fishaudio/fish-speech-1.5").to(device) model.eval() # 处理每个文本文件 for filename in os.listdir(input_dir): if filename.endswith(".txt"): input_path = os.path.join(input_dir, filename) output_path = os.path.join(output_dir, filename.replace(".txt", ".wav")) # 读取文本 with open(input_path, "r", encoding="utf-8") as f: text = f.read().strip() if not text: continue # 合成语音 inputs = processor( text=text, language=language, return_tensors="pt" ).to(device) with torch.no_grad(): generated = model.generate( inputs["input_ids"], attention_mask=inputs.get("attention_mask"), max_new_tokens=500, do_sample=True, temperature=0.7, ) audio = generated[0].cpu().numpy() # 保存 import soundfile as sf sf.write(output_path, audio, 24000) print(f"已处理: {filename} -> {output_path}") print("批量处理完成!") # 使用示例 # batch_text_to_speech("./texts", "./audios")7.3 与Web应用集成
你还可以把Fish-Speech集成到Web应用里,比如做个在线语音合成工具。
from flask import Flask, request, send_file import io app = Flask(__name__) # 全局模型变量 model = None processor = None def init_model(): """初始化模型(只执行一次)""" global model, processor if model is None: device = "cuda" if torch.cuda.is_available() else "cpu" processor = AutoProcessor.from_pretrained("fishaudio/fish-speech-1.5") model = TTS.from_pretrained("fishaudio/fish-speech-1.5").to(device) model.eval() @app.route('/synthesize', methods=['POST']) def synthesize(): """语音合成API接口""" init_model() # 获取请求参数 data = request.json text = data.get('text', '') language = data.get('language', 'zh') if not text: return {"error": "No text provided"}, 400 # 合成语音 device = "cuda" if torch.cuda.is_available() else "cpu" inputs = processor( text=text, language=language, return_tensors="pt" ).to(device) with torch.no_grad(): generated = model.generate( inputs["input_ids"], attention_mask=inputs.get("attention_mask"), max_new_tokens=500, do_sample=True, temperature=0.7, ) audio = generated[0].cpu().numpy() # 创建内存中的音频文件 audio_io = io.BytesIO() import soundfile as sf sf.write(audio_io, audio, 24000, format='WAV') audio_io.seek(0) # 返回音频文件 return send_file( audio_io, mimetype='audio/wav', as_attachment=True, download_name='synthesized.wav' ) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)这个简单的Flask应用提供了一个API接口,其他应用可以通过HTTP请求来调用语音合成功能。
8. 总结
走完这一趟,你应该对Fish-Speech-1.5在Python环境下的部署和调用有了比较清楚的认识。从环境搭建、模型加载,到基础的文字转语音、进阶的语音克隆,再到实际的应用集成,整个过程虽然有些步骤,但按部就班来做并不复杂。
实际用下来,Fish-Speech-1.5的语音质量确实不错,特别是对中文的支持,听起来比很多开源TTS模型都要自然。语音克隆功能也挺实用的,虽然效果跟参考音频的质量关系很大,但用好了能做出挺有意思的应用。
部署过程中最可能遇到的就是环境配置和内存问题。我的建议是,如果第一次用,先从最简单的例子开始,确保基础功能能跑通,然后再慢慢尝试更复杂的场景。GPU内存不够的话,可以试试用CPU模式,或者调整生成参数来减少内存占用。
最后,Fish-Speech还在不断更新,新的版本可能会有更好的效果和更多的功能。如果你在使用的过程中遇到问题,可以去GitHub上看看项目的Issues,或者加入他们的社区讨论。开源项目的优势就是有社区支持,很多问题别人可能已经遇到并解决了。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。