chumtts2 / infer.py
chumdz97's picture
Upload folder using huggingface_hub
2271dee verified
Raw
History Blame Contribute Delete
3.46 kB
import torch
import torchaudio
import soundfile as sf
from omnivoice import OmniVoice, OmniVoiceGenerationConfig
# Load model vừa tải
model = OmniVoice.from_pretrained(
"/home/thien/chum/omnivoice", # Trỏ vào thư mục vừa tải về
device_map="cuda:0",
dtype=torch.float16,
)
# Create voice prompt once (caches the encoded reference audio)
# LƯU Ý: Vẫn phải sửa ref_text cho khớp 100% với file phuongtrang.wav nhé!
voice_prompt = model.create_voice_clone_prompt(
ref_audio="/home/thien/chum/omnivoice/manhdung.wav",
ref_text="trường quê em do bố của em xây kỹ nên sạch sẽ đẹp đẽ và rất kiên cố mọi người ơi",
)
print("Đang xử lý text và infer từng câu...")
# Tăng guidance_scale (CFG) lên cao (ví dụ: 4.5 hoặc 5.0) để ép model bám sát chữ, đọc rõ ràng rành mạch hơn (đổi lại sẽ nghe hơi giống Google Dịch/robot).
# Tăng num_step lên 32 để audio được sinh ra chi tiết và mượt hơn.
config = OmniVoiceGenerationConfig(num_step=32, guidance_scale=5)
raw_text = """
Trước đó khi xem anime, mấy cái ấn "bá bá bá" trong một giây có vẻ rất đơn giản, nhưng khi thực sự bắt tay vào làm, Kyushin mới cảm nhận được độ khó.
Một mặt phải chú ý giữ đúng tư thế kết ấn, mặt khác còn phải phân tâm kiểm soát Chakra vận chuyển trong cơ thể. Kyushin mới luyện tập một lần đã cảm thấy đầu đầy mồ hôi.
Bất quá cũng may, cơ thể này không hoàn toàn không có nền tảng. Người tộc Uzumaki có thể chất tốt hơn, tương tự ở khoảng bốn, năm tuổi đã bắt đầu tu luyện.
Kyushin hiện tại tròn sáu tuổi rưỡi. Với nền tảng từ ký ức tu luyện trước đó, việc tu luyện tiếp theo dần trở nên thuận lợi.
Tuy nhiên, hiện tại Kyushin chỉ có thể đảm bảo kết ấn theo đúng trình tự mới tương đối thuận lợi. Nếu xáo trộn trình tự, đôi khi còn bị dừng lại.
Đây là vấn đề về độ thuần thục. Các vị trưởng lão trong tộc yêu cầu đối với "Ấn" là, bất kể trình tự nào, khi kết ấn, Chakra trong cơ thể phải tự động vận chuyển. Như vậy mới được coi là hợp cách, mới có thể tiến vào bước tiếp theo học tập nhẫn thuật cơ bản...
"""
# 2. Tách câu để đọc (Mô hình TTS dễ bị lỗi nếu nhồi 1 cục text quá dài)
import re
import numpy as np
# Tách theo dấu chấm, chấm hỏi, chấm than, hoặc xuống dòng
sentences = [s.strip() for s in re.split(r'(?<=[.!?\n])\s+', raw_text) if s.strip()]
audio_chunks = []
for i, sentence in enumerate(sentences):
print(f"Đang đọc câu {i+1}/{len(sentences)}: {sentence}")
audio = model.generate(
text=sentence,
language="vietnamese",
voice_clone_prompt=voice_prompt,
generation_config=config,
speed=1.2,
)
audio_chunks.append(audio[0])
# Thêm 1 khoảng lặng ngắn giữa các câu (vd: 0.3s)
silence = np.zeros(int(24000 * 0.1), dtype=np.float32)
audio_chunks.append(silence)
# Ghép tất cả các đoạn audio lại với nhau
final_audio = np.concatenate(audio_chunks)
sf.write("output.wav", final_audio, 24000)
print("Đã lưu xong file output.wav!")