fastspeech2 / app.py
Ryanus's picture
Update app.py
9a15bbe verified
# app.py
import gradio as gr
import torchaudio
from speechbrain.inference.TTS import FastSpeech2
from speechbrain.inference.vocoders import HIFIGAN
import os
import torch
# 載入 FastSpeech2 模型
fastspeech2 = FastSpeech2.from_hparams(
source="speechbrain/tts-fastspeech2-ljspeech",
savedir="pretrained_models/tts-fastspeech2-ljspeech",
run_opts={"device":"cpu"}
)
# 載入聲碼器 (Vocoder)
hifi_gan = HIFIGAN.from_hparams(
source="speechbrain/tts-hifigan-ljspeech",
savedir="pretrained_models/tts-hifigan-ljspeech",
run_opts={"device":"cpu"}
)
def synthesize_speech(text):
"""
將輸入文字轉換為語音。
"""
# 檢查輸入文字是否為空或只包含空白字元
if not text or text.strip() == "":
# 返回一個錯誤訊息或空音訊,而不是直接 None
# Gradio 介面會顯示這個錯誤訊息
return None, "請輸入有效的文字進行語音合成。"
try:
# 將文字編碼為梅爾頻譜圖
mel_outputs, durations, pitch, energy = fastspeech2.encode_text(
[text], pace=1.0
)
# 使用聲碼器將梅爾頻譜圖轉換為音訊波形
wav = hifi_gan.decode_batch(mel_outputs).squeeze(1)
# 將音訊張量轉換為 NumPy 陣列
audio_numpy = wav.cpu().numpy().flatten()
# 定義輸出檔案路徑
output_file = "output.wav"
# 將音訊保存為 WAV 檔案
torchaudio.save(output_file, torch.tensor(audio_numpy).unsqueeze(0), 16000)
return output_file, "語音合成成功!"
except IndexError as e:
# 捕獲特定的 IndexError,並提供更詳細的錯誤訊息
return None, f"語音合成失敗:處理文字時發生錯誤 (IndexError)。請嘗試不同的文字。錯誤詳情: {e}"
except Exception as e:
# 捕獲其他所有可能的錯誤
return None, f"語音合成失敗:發生未知錯誤。錯誤詳情: {e}"
# 創建 Gradio 介面
iface = gr.Interface(
fn=synthesize_speech,
inputs=gr.Textbox(lines=2, placeholder="請輸入您想要合成的文字..."),
outputs=[
gr.Audio(type="filepath", label="合成語音"),
gr.Textbox(label="狀態訊息") # 新增一個文字框來顯示狀態或錯誤訊息
],
title="FastSpeech2 文字轉語音 (CPU)",
description="這是一個使用 SpeechBrain 的 FastSpeech2 模型在 Hugging Face Spaces 的 CPU 上進行文字轉語音的演示。由於在 CPU 上運行,合成速度可能會較慢。",
examples=[
["你好,這是一個使用 FastSpeech2 進行語音合成的範例。"],
["Hugging Face Spaces 讓部署機器學習應用變得非常簡單。"],
["在 CPU 上運行大型模型可能需要一些時間。"]
]
)
# 啟動 Gradio 應用程式
iface.launch()