Update app.py
Browse files
app.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
from transformers import pipeline
|
| 3 |
import torch
|
| 4 |
import numpy as np
|
| 5 |
import plotly.graph_objects as go
|
|
@@ -11,11 +11,11 @@ HF_HOME = os.getenv("HF_HOME", "./hf_cache")
|
|
| 11 |
os.makedirs(HF_HOME, exist_ok=True)
|
| 12 |
|
| 13 |
# 定义模型路径和名称
|
| 14 |
-
# 模型 A: 文本到语音 (Text-to-Speech)
|
| 15 |
-
MODEL_TTS = "
|
| 16 |
|
| 17 |
-
# 模型 B: 文本到音效/简单音频 (Text-to-Audio/Sound Generation)
|
| 18 |
-
MODEL_AUDIOGEN = "facebook/audiogen-small"
|
| 19 |
|
| 20 |
# 确定加载模型的设备
|
| 21 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
@@ -26,18 +26,20 @@ tts_pipeline = None
|
|
| 26 |
audiogen_pipeline = None # 保持声明,但不会加载
|
| 27 |
|
| 28 |
def load_tts_model():
|
| 29 |
-
"""加载 MMS-TTS 模型。"""
|
| 30 |
print(f"正在加载 TTS 模型: {MODEL_TTS} 到 {device}...")
|
| 31 |
try:
|
|
|
|
|
|
|
|
|
|
| 32 |
pipe = pipeline("text-to-speech", model=MODEL_TTS, device=device)
|
| 33 |
-
print("
|
| 34 |
return pipe
|
| 35 |
except Exception as e:
|
| 36 |
-
print(f"加载
|
| 37 |
return None
|
| 38 |
|
| 39 |
# !!! 注意:这个函数仍然存在,但不会在 initialize_all_models 中调用 !!!
|
| 40 |
-
# 如果你想在未来使用 AudioGen,可以手动取消注释
|
| 41 |
def load_audiogen_model():
|
| 42 |
"""加载 AudioGen-small 模型。"""
|
| 43 |
print(f"正在加载 AudioGen 模型: {MODEL_AUDIOGEN} 到 {device}...")
|
|
@@ -58,9 +60,9 @@ def initialize_all_models():
|
|
| 58 |
# --- 音频生成推理函数 ---
|
| 59 |
|
| 60 |
def generate_audio_tts(prompt):
|
| 61 |
-
"""使用
|
| 62 |
if tts_pipeline is None:
|
| 63 |
-
print("
|
| 64 |
return (16000, np.zeros(0)) # 返回空音频
|
| 65 |
try:
|
| 66 |
result = tts_pipeline(prompt)
|
|
@@ -68,7 +70,7 @@ def generate_audio_tts(prompt):
|
|
| 68 |
sampling_rate = result['sampling_rate']
|
| 69 |
return (sampling_rate, audio_array)
|
| 70 |
except Exception as e:
|
| 71 |
-
print(f"使用
|
| 72 |
return (16000, np.zeros(0))
|
| 73 |
|
| 74 |
def generate_audio_audiogen(prompt):
|
|
@@ -90,7 +92,7 @@ def arena_predict(prompt):
|
|
| 90 |
"""Arena 选项卡的主预测函数。只加载 TTS 模型时,AudioGen 将返回空。"""
|
| 91 |
print(f"收到提示词: {prompt}")
|
| 92 |
|
| 93 |
-
#
|
| 94 |
tts_sr, tts_audio = generate_audio_tts(prompt)
|
| 95 |
|
| 96 |
# AudioGen-small 生成 (此处会因为 audiogen_pipeline 为 None 而返回空音频)
|
|
@@ -101,7 +103,7 @@ def arena_predict(prompt):
|
|
| 101 |
# --- 模型对比/GRACE评估逻辑 ---
|
| 102 |
# 假设的 GRACE 评估数据
|
| 103 |
grace_data = {
|
| 104 |
-
"MMS-TTS-Eng": {
|
| 105 |
"Generalization": 2.5,
|
| 106 |
"Relevance": 4.5,
|
| 107 |
"Artistry": 4.0,
|
|
@@ -162,23 +164,23 @@ report_content = """
|
|
| 162 |
|
| 163 |
### 1.1 所选模型的类型及背景说明
|
| 164 |
本次实验聚焦于**文本到音频(Text-to-Audio)生成模型**,具体选择了两个在功能上有所侧重且模型尺寸相对较小的模型进行对比:
|
| 165 |
-
1. **`
|
| 166 |
2. **`facebook/audiogen-small` (AudioGen-small)**:这款模型是 Meta AI AudioCraft 框架下的一个较小版本,专注于**文本到音效或简单音频片段**的生成。它能够根据文本描述创建环境音、乐器声或短小的声音事件。
|
| 167 |
|
| 168 |
### 1.2 模型用途对比简述
|
| 169 |
-
* **
|
| 170 |
* **AudioGen-small** 的主要用途是根据文本描述生成各种**非语音的音效或短音乐片段**,例如“雨声”、“鸟鸣”或“简单的吉他旋律”,适用于游戏音效、视频配乐或环境音模拟。
|
| 171 |
|
| 172 |
### 1.3 两个模型异同点分析
|
| 173 |
**相同点:**
|
| 174 |
* 都属于文本到音频生成领域,将文本作为输入。
|
| 175 |
-
* 都
|
| 176 |
-
* 都相对轻量级,相比大型文生音/乐模型
|
| 177 |
|
| 178 |
**不同点:**
|
| 179 |
-
* **核心功能:**
|
| 180 |
-
* **输出类型:**
|
| 181 |
-
* **内部机制:** 尽管都基于 Transformer 架构,但它们的内部训练数据、任务目标和具体架构优化不同,以适应各自的生成任务。
|
| 182 |
|
| 183 |
---
|
| 184 |
|
|
@@ -193,9 +195,9 @@ report_content = """
|
|
| 193 |
```mermaid
|
| 194 |
graph TD
|
| 195 |
A[用户输入文本提示词] --> B{Gradio UI};
|
| 196 |
-
B --> C1[
|
| 197 |
B --> C2[AudioGen-small 模型];
|
| 198 |
-
C1 -- 生成语音 --> D1[
|
| 199 |
C2 -- 生成音效 --> D2[AudioGen-small 音频输出];
|
| 200 |
D1 --> E[Arena 选项卡展示];
|
| 201 |
D2 --> E;
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
from transformers import pipeline # 保持使用 transformers pipeline
|
| 3 |
import torch
|
| 4 |
import numpy as np
|
| 5 |
import plotly.graph_objects as go
|
|
|
|
| 11 |
os.makedirs(HF_HOME, exist_ok=True)
|
| 12 |
|
| 13 |
# 定义模型路径和名称
|
| 14 |
+
# 模型 A: 文本到语音 (Text-to-Speech) - 更换为 SpeechBrain 的轻量级模型
|
| 15 |
+
MODEL_TTS = "speechbrain/tts-tacotron2-ljspeech"
|
| 16 |
|
| 17 |
+
# 模型 B: 文本到音效/简单音频 (Text-to-Audio/Sound Generation) - 仍然不加载
|
| 18 |
+
MODEL_AUDIOGEN = "facebook/audiogen-small"
|
| 19 |
|
| 20 |
# 确定加载模型的设备
|
| 21 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
|
|
| 26 |
audiogen_pipeline = None # 保持声明,但不会加载
|
| 27 |
|
| 28 |
def load_tts_model():
|
| 29 |
+
"""加载 MMS-TTS 模型。现在尝试 SpeechBrain 的 Tacotron2。"""
|
| 30 |
print(f"正在加载 TTS 模型: {MODEL_TTS} 到 {device}...")
|
| 31 |
try:
|
| 32 |
+
# 对于 SpeechBrain 的模型,直接使用 pipeline 可能更简单
|
| 33 |
+
# 注意:SpeechBrain 的 pipeline 可能需要安装 speechbrain 库
|
| 34 |
+
# 确保你的 requirements.txt 包含 speechbrain
|
| 35 |
pipe = pipeline("text-to-speech", model=MODEL_TTS, device=device)
|
| 36 |
+
print("TTS 模型加载成功。")
|
| 37 |
return pipe
|
| 38 |
except Exception as e:
|
| 39 |
+
print(f"加载 TTS (SpeechBrain) 时出错: {e}")
|
| 40 |
return None
|
| 41 |
|
| 42 |
# !!! 注意:这个函数仍然存在,但不会在 initialize_all_models 中调用 !!!
|
|
|
|
| 43 |
def load_audiogen_model():
|
| 44 |
"""加载 AudioGen-small 模型。"""
|
| 45 |
print(f"正在加载 AudioGen 模型: {MODEL_AUDIOGEN} 到 {device}...")
|
|
|
|
| 60 |
# --- 音频生成推理函数 ---
|
| 61 |
|
| 62 |
def generate_audio_tts(prompt):
|
| 63 |
+
"""使用 TTS 模型生成语音。"""
|
| 64 |
if tts_pipeline is None:
|
| 65 |
+
print("TTS 模型未加载或加载失败。")
|
| 66 |
return (16000, np.zeros(0)) # 返回空音频
|
| 67 |
try:
|
| 68 |
result = tts_pipeline(prompt)
|
|
|
|
| 70 |
sampling_rate = result['sampling_rate']
|
| 71 |
return (sampling_rate, audio_array)
|
| 72 |
except Exception as e:
|
| 73 |
+
print(f"使用 TTS 生成音频出错: {e}")
|
| 74 |
return (16000, np.zeros(0))
|
| 75 |
|
| 76 |
def generate_audio_audiogen(prompt):
|
|
|
|
| 92 |
"""Arena 选项卡的主预测函数。只加载 TTS 模型时,AudioGen 将返回空。"""
|
| 93 |
print(f"收到提示词: {prompt}")
|
| 94 |
|
| 95 |
+
# TTS 生成
|
| 96 |
tts_sr, tts_audio = generate_audio_tts(prompt)
|
| 97 |
|
| 98 |
# AudioGen-small 生成 (此处会因为 audiogen_pipeline 为 None 而返回空音频)
|
|
|
|
| 103 |
# --- 模型对比/GRACE评估逻辑 ---
|
| 104 |
# 假设的 GRACE 评估数据
|
| 105 |
grace_data = {
|
| 106 |
+
"MMS-TTS-Eng": { # 虽然现在用 SpeechBrain,但报表里仍沿用原名
|
| 107 |
"Generalization": 2.5,
|
| 108 |
"Relevance": 4.5,
|
| 109 |
"Artistry": 4.0,
|
|
|
|
| 164 |
|
| 165 |
### 1.1 所选模型的类型及背景说明
|
| 166 |
本次实验聚焦于**文本到音频(Text-to-Audio)生成模型**,具体选择了两个在功能上有所侧重且模型尺寸相对较小的模型进行对比:
|
| 167 |
+
1. **`speechbrain/tts-tacotron2-ljspeech` (新的 TTS 模型)**:这是一个由 SpeechBrain 开发的**文本到语音(Text-to-Speech, TTS)**模型,基于 Tacotron2 架构。相比之前尝试的模型,它通常更小巧,对计算资源的需求可能更低,因此更适合在有限的 CPU 环境下运行。
|
| 168 |
2. **`facebook/audiogen-small` (AudioGen-small)**:这款模型是 Meta AI AudioCraft 框架下的一个较小版本,专注于**文本到音效或简单音频片段**的生成。它能够根据文本描述创建环境音、乐器声或短小的声音事件。
|
| 169 |
|
| 170 |
### 1.2 模型用途对比简述
|
| 171 |
+
* **TTS 模型 (Tacotron2)** 的主要用途是将书面文本转换为自然发音的**人类语音**,适用于有声读物、语音助手、导航系统等场景。
|
| 172 |
* **AudioGen-small** 的主要用途是根据文本描述生成各种**非语音的音效或短音乐片段**,例如“雨声”、“鸟鸣”或“简单的吉他旋律”,适用于游戏音效、视频配乐或环境音模拟。
|
| 173 |
|
| 174 |
### 1.3 两个模型异同点分析
|
| 175 |
**相同点:**
|
| 176 |
* 都属于文本到音频生成领域,将文本作为输入。
|
| 177 |
+
* 都可在 Hugging Face Hub 上找到。
|
| 178 |
+
* 都相对轻量级,相比大型文生音/乐模型对资源要求更低。
|
| 179 |
|
| 180 |
**不同点:**
|
| 181 |
+
* **核心功能:** TTS 模型专注于**语音合成**,目标是还原人类语音的自然度;AudioGen 专注于**非语音音频生成**,目标是模拟真实世界的音效或创作音乐片段。
|
| 182 |
+
* **输出类型:** TTS 模型输出的是人类语言的声音;AudioGen 输出的是环境音、乐器音、抽象音效等。
|
| 183 |
+
* **内部机制:** 尽管都基于 Transformer 架构(Tacotron2 包含编码器和解码器),但它们的内部训练数据、任务目标和具体架构优化不同,以适应各自的生成任务。
|
| 184 |
|
| 185 |
---
|
| 186 |
|
|
|
|
| 195 |
```mermaid
|
| 196 |
graph TD
|
| 197 |
A[用户输入文本提示词] --> B{Gradio UI};
|
| 198 |
+
B --> C1[TTS 模型];
|
| 199 |
B --> C2[AudioGen-small 模型];
|
| 200 |
+
C1 -- 生成语音 --> D1[TTS 音频输出];
|
| 201 |
C2 -- 生成音效 --> D2[AudioGen-small 音频输出];
|
| 202 |
D1 --> E[Arena 选项卡展示];
|
| 203 |
D2 --> E;
|