Skill: jaskies/smart-speak-jaskies (version 1.0.0)

--- name: smart-speak description: Chuyển đổi văn bản đa ngôn ngữ (Việt - Hoa - Anh) thành giọng nói chuẩn xác. Tự động xử lý Pinyin và ghép nối âm thanh chất lượng cao. Yêu cầu cài đặt edge-tts và ffmpeg. --- # Smart-Speak: Trợ lý Giọng nói Đa ngôn ngữ Skill này giúp em tạo ra các file âm thanh bài giảng hoặc thông báo chất lượng cao, kết hợp mượt mà giữa tiếng Việt, tiếng Hoa (bao gồm cả Pinyin) và tiếng Anh. ## Yêu cầu hệ thống Để skill này hoạt động hoàn hảo, máy của anh cần được trang bị các công cụ sau: 1. **Python 3**: Nền tảng để chạy script xử lý. 2. **edge-tts**: Thư viện cung cấp giọng đọc AI cực kỳ tự nhiên của Microsoft Edge. 3. **ffmpeg**: Bộ công cụ mạnh mẽ để ghép nối các đoạn âm thanh. ### Lệnh cài đặt nhanh (cho Linux/Ubuntu) Anh chạy các dòng lệnh sau trong terminal để chuẩn bị nhé: ```bash # Cài đặt ffmpeg sudo apt update && sudo apt install -y ffmpeg # Cài đặt edge-tts python3 -m pip install edge-tts ``` ## Tính năng nổi bật 1. **Xử lý Pinyin thông minh:** Tự động nhận diện và chuyển đổi Pinyin sang Hán tự trước khi đọc để đảm bảo thanh điệu chuẩn xác 100%. 2. **Phân đoạn ngôn ngữ:** Tự động chia nhỏ văn bản thành các khối ngôn ngữ riêng biệt để áp dụng đúng giọng đọc bản ngữ. 3. **Giọng đọc ưu tiên:** * 🇻🇳 Tiếng Việt: `vi-VN-HoaiMyNeural` (Dịu dàng, truyền cảm) * 🇨🇳 Tiếng Hoa: `zh-CN-XiaoxiaoNeural` (Chuẩn giọng Bắc Kinh) * 🇺🇸 Tiếng Anh: `en-US-AvaNeural` (Tự nhiên, hiện đại) ## Quy trình thực hiện 1. **Phân tích:** Tách câu thành các đoạn dựa trên ngôn ngữ. 2. **Chuyển đổi:** Chuyển các đoạn Pinyin sang Hán tự (ví dụ: "Nǐ hǎo" -> "你好"). 3. **Tổng hợp:** Gọi `smart_speak.py` để tạo từng đoạn âm thanh nhỏ và dùng `ffmpeg` ghép lại thành một file `.mp3` duy nhất. ## Lệnh thực thi mẫu ```bash python3 skills/public/smart-speak/scripts/smart_speak.py \ --segments-json '[ {"text": "Chào anh Vũ,", "voice": "vi-VN-HoaiMyNeural"}, {"text": "你好吗？", "voice": "zh-CN-XiaoxiaoNeural"}, {"text": "How are you today?", "voice": "en-US-AvaNeural"} ]' \ --output "/home/jackie_chen_phong/.openclaw/workspace/bai_hoc.mp3" ``` ## Lưu ý quan trọng - **Đường dẫn tuyệt đối:** Luôn cung cấp đường dẫn đầy đủ cho file đầu ra (`--output`). - **Xử lý Emoji:** Skill sẽ tự động lược bỏ emoji để tránh máy đọc tên emoji làm gián đoạn bài học. - **Dấu câu:** Mỗi đoạn văn nên kết thúc bằng dấu câu phù hợp để tạo quãng nghỉ tự nhiên.

path: scripts/smart_speak.py
content: #!/usr/bin/env python3
import argparse
import json
import os
import subprocess
import tempfile
import sys

def main():
    parser = argparse.ArgumentParser(description="Multilingual TTS merging script")
    parser.add_argument("--segments-json", required=True, help="JSON string of segments [{'text': '...', 'voice': '...'}]")
    parser.add_argument("--output", required=True, help="Path to the output mp3 file")
    
    args = parser.parse_args()
    
    try:
        segments = json.loads(args.segments_json)
    except json.JSONDecodeError as e:
        print(f"Error parsing segments JSON: {e}", file=sys.stderr)
        sys.exit(1)
        
    if not segments:
        print("No segments provided", file=sys.stderr)
        sys.exit(1)
        
    temp_dir = tempfile.mkdtemp()
    concat_file_path = os.path.join(temp_dir, "concat.txt")
    temp_files = []
    
    try:
        with open(concat_file_path, "w") as f_concat:
            for i, segment in enumerate(segments):
                text = segment.get("text", "").strip()
                voice = segment.get("voice", "vi-VN-HoaiMyNeural")
                
                if not text:
                    continue
                
                temp_file = os.path.join(temp_dir, f"part_{i}.mp3")
                
                # Call edge-tts
                # Using absolute path for edge-tts as per workspace notes
                edge_tts_path = "/home/jackie_chen_phong/.local/bin/edge-tts"
                cmd = [
                    edge_tts_path,
                    "--voice", voice,
                    "--text", text,
                    "--write-media", temp_file
                ]
                
                result = subprocess.run(cmd, capture_output=True, text=True)
                if result.returncode != 0:
                    print(f"Error generating TTS for segment {i}: {result.stderr}", file=sys.stderr)
                    continue
                
                if os.path.exists(temp_file):
                    f_concat.write(f"file '{temp_file}'\n")
                    temp_files.append(temp_file)
        
        if not temp_files:
            print("No audio files generated", file=sys.stderr)
            sys.exit(1)
            
        # Run ffmpeg to merge
        ffmpeg_cmd = [
            "ffmpeg", "-y", "-f", "concat", "-safe", "0",
            "-i", concat_file_path,
            "-c", "copy",
            args.output
        ]
        
        result = subprocess.run(ffmpeg_cmd, capture_output=True, text=True)
        if result.returncode != 0:
            print(f"Error merging audio with ffmpeg: {result.stderr}", file=sys.stderr)
            sys.exit(1)
            
        print(f"Successfully generated multilingual audio: {args.output}")
        
    finally:
        # Cleanup
        for f in temp_files:
            try: os.remove(f)
            except: pass
        try: os.remove(concat_file_path)
        except: pass
        try: os.rmdir(temp_dir)
        except: pass

if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)