Logo UPTRADINGVN

chức năng Phát Thanh Viên AI (Podcast)

    Để làm tính năng này, chúng ta sẽ không dùng những giọng đọc "chị Google" đều đều vô hồn nữa. Mình sẽ tích hợp thẳng công nghệ lõi Edge-TTS của Microsoft. Đây là công nghệ AI phân tích giọng nói siêu thực, biết ngắt nghỉ, có ngữ điệu trầm bổng, nghe 99% giống một MC nam biên tập viên bản tin tài chính thực thụ!
Bạn làm theo đúng 2 bước này để rước "Anh Phát Thanh Viên" về máy nhé:

🎙️ BƯỚC 1: Thuê Phát Thanh Viên (Cài Thư Viện Voice)

Bác mở cái bảng đen Command Prompt (cmd) lên, copy lệnh này dán vào và ấn Enter: python -m pip install edge-tts (Đợi nó chạy tải về báo Successfully installed... là xong).

🎹 BƯỚC 2: Nâng Cấp Kịch Bản & Phòng Thu Âm Tự Động

Ở bản cập nhật này, mình đã thêm một "chiêu" rất hay: Ép con AI Gemini viết phần kịch bản nói vào giữa 2 cái thẻ [START_AUDIO] và [END_AUDIO]. Nhờ đó, máy tính sẽ chỉ bốc đúng phần văn bản tiếng Việt mượt mà đi thu âm, bỏ lại các phần tiêu đề hay lệnh tạo ảnh tiếng Anh để không bị đọc lộn xộn.
Bác mở file SanXuat_Content.py, xóa trắng và dán nguyên bản Full AI + Audio này vào nhé:
import os
import datetime
from google import genai

# ==========================================
# 1. CẤU HÌNH BỘ NÃO AI GEMINI THẾ HỆ MỚI
# ==========================================
GOOGLE_API_KEY = "API_KEY_CUA_BAN"

FILE_PATH = r"C:\ZaloSignal\signal.txt"
OUTPUT_PATH = r"C:\ZaloSignal\KichBan_Youtube_AI.txt"
AUDIO_PATH = r"C:\ZaloSignal\BanTin_Uptradingvn.mp3" # <--- File nhạc MP3 sẽ xuất ra đây

def tao_kich_ban_bang_AI():
    if not os.path.exists(FILE_PATH):
        print("❌ LỖI: Không tìm thấy file signal.txt!")
        return

    with open(FILE_PATH, "r", encoding="utf-8") as f:
        content = f.read().strip()
    
    if not content:
        print("❌ LỖI: File signal.txt trống rỗng!")
        return

    # 2. BÓC TÁCH MÃ CỔ PHIẾU
    signals = content.split("---END---")
    ma_mua = []
    
    for sig in signals:
        lines = sig.strip().split('\n')
        ticker, pattern, pct = "", "", ""
        for line in lines:
            if "Mã:" in line:
                ticker = line.split("Mã:")[1].split("(")[0].strip()
                pct = line.split("(")[1].replace(")", "").strip() if "(" in line else ""
            elif "Mô hình:" in line:
                pattern = line.split("Mô hình:")[1].strip()
        
        if ticker:
            ma_mua.append(f"- Mã {ticker} (Tăng {pct}): Mô hình {pattern}")

    if not ma_mua:
        print("❌ Hôm nay không có mã MUA nào. AI đang đi ngủ!")
        return

    danh_sach_ma = "\n".join(ma_mua)
    ngay_hom_nay = datetime.datetime.now().strftime("%d/%m/%Y")

    print(f"🔄 AI ĐANG VIẾT KỊCH BẢN CHO {len(ma_mua)} MÃ... (Chờ 5-10 giây)")

    # 3. RA LỆNH CHO AI ĐÓNG VAI YOUTUBER & MC
    lenh_cho_AI = f"""
    Bạn là một chuyên gia chứng khoán thực chiến, một YouTuber của kênh "Uptradingvn". Phong cách tự tin, máu lửa, đánh theo dòng tiền VSA và Wyckoff.
    Hôm nay ngày {ngay_hom_nay}, chúng ta có các mã nổ Vol sau:
    {danh_sach_ma}

    Hãy viết Kịch Bản với yêu cầu CỰC KỲ QUAN TRỌNG sau:
    1. Tiêu đề: Đề xuất 3 tiêu đề giật tít, chuẩn SEO.
    2. ĐÓNG GÓI LỜI THOẠI: BẮT BUỘC đặt toàn bộ lời thoại (phần sẽ được MC đọc) vào giữa 2 thẻ [START_AUDIO] và [END_AUDIO]. 
    3. TRONG LỜI THOẠI CỦA MC (Yêu cầu phiên âm): 
       - PHIÊN ÂM MÃ CỔ PHIẾU: Bắt buộc đánh vần từng chữ cái của mã cổ phiếu theo tiếng Việt để máy đọc chuẩn. Cụ thể: KBC phải viết là "Ca Bê Xê", HDB viết là "Hát Đê Bê", GSP viết là "Gờ Ét Pê", DQC viết là "Đê Quy Xê", HT1 viết là "Hát Tê Một", TIG viết là "Tê Y Gờ", VC7 viết là "Vê Xê Bảy"...
       - PHIÊN ÂM THUẬT NGỮ: Wyckoff bắt buộc viết là "Quai-Cọp", VSA viết là "Vê-Ét-A", Pocket Pivot viết là "Pốc-két Pi-vọt", Breakout viết là "Bờ-rếch-ao", Vol viết là "Von".
       - Xưng "Tôi" hoặc "Uptradingvn", gọi khán giả là "anh chị em nhà đầu tư". Không dùng ngoặc vuông điền chỗ trống.
    4. Ở dưới cùng (Ngoài thẻ Audio), viết 1 Prompt TIẾNG ANH để tạo ảnh Thumbnail: "A confident Asian male stock trader, wearing a stylish t-shirt with the bold text 'uptradingvn' printed on the chest, futuristic glowing green stock market charts, 8k --ar 16:9".
    """

    try:
        # GỌI BỘ NÃO GEMINI
        client = genai.Client(api_key=GOOGLE_API_KEY)
        response = client.models.generate_content(
            model='gemini-2.5-flash',
            contents=lenh_cho_AI
        )
        
        with open(OUTPUT_PATH, "w", encoding="utf-8") as f:
            f.write(response.text)
        
        print(f"✅ AI ĐÃ VIẾT XONG TEXT! Đang chuyển qua phòng Thu âm...")

        # 4. CHUYỂN TEXT THÀNH GIỌNG NÓI (PODCAST)
        if "[START_AUDIO]" in response.text and "[END_AUDIO]" in response.text:
            audio_text = response.text.split("[START_AUDIO]")[1].split("[END_AUDIO]")[0].strip()
            
            # --- BỘ LỌC CỨNG: ÉP MÁY ĐỌC CHUẨN (Thêm 2 dòng này vào) ---
            audio_text = audio_text.replace("Wyckoff", "Quai cọp").replace("VSA", "Vê Ét A").replace("Vol", "Von")
            audio_text = audio_text.replace("Pocket Pivot", "Pốc két Pi vọt").replace("Breakout", "Bờ rếch ao")
            
            # Lưu tạm nội dung đọc ra file txt
            temp_path = r"C:\ZaloSignal\temp_audio.txt"
            with open(temp_path, "w", encoding="utf-8") as f:
                f.write(audio_text)

            print("🎧 ĐANG THU ÂM (Giọng Nam Minh Neural - Trầm ấm, nam tính)... (Chờ 10 giây)")
            
            # Gọi lệnh Edge-TTS thu âm (Đã bọc qua Python)
            os.system(f'python -m edge_tts --voice vi-VN-NamMinhNeural -f "{temp_path}" --write-media "{AUDIO_PATH}"')
            
            if os.path.exists(temp_path):
                os.remove(temp_path) # Xóa giấy nháp
                
            print(f"🎤 XUẤT XƯỞNG THÀNH CÔNG! Bác mở file MP3 nghe thử tại:\n{AUDIO_PATH}")
        else:
            print("⚠️ LỖI: AI không chịu tạo thẻ [START_AUDIO], không thể thu âm được. Bác chạy lại lệnh nhé.")

    except Exception as e:
        print(f"⚠️ Có lỗi xảy ra: {e}")

if __name__ == "__main__":
    tao_kich_ban_bang_AI()
    input("\n👉 Quá trình kết thúc. Bấm phím Enter để tắt bảng đen này...")

Nâng cấp giọng đọc

    Đã làm thương hiệu thì phải dùng "hàng hiệu". Giọng Neural2 của Google Cloud chính là "vũ khí bí mật" mà các đài truyền hình hay các kênh Podcast tài chính chuyên nghiệp đang xài ẩn danh đấy. Giọng nam trầm ấm, đĩnh đạc, nhả chữ cực kỳ uy lực!

Để mời được anh "MC Đài Truyền Hình" này về máy, bác làm theo đúng 2 giai đoạn sau (chịu khó khoảng 3 phút thao tác trên web nhé):

Bước 1: Tạo dự án mới (Project)

  • Bạn truy cập vào trang: console.cloud.google.com (Đăng nhập bằng Gmail).
  • Nhìn lên góc trên cùng bên trái (cạnh chữ Google Cloud), bác bấm vào cái ô chọn dự án (thường nó ghi là Select a project hoặc tên một dự án cũ).
  • Một bảng hiện ra, bác chọn NEW PROJECT ở góc trên bên phải của bảng đó.
  • Đặt tên là Uptrading-Voice rồi bấm CREATE. Đợi khoảng 10 giây cho nó chạy xong.

Bước 2: Bật "Công tắc" giọng nói (Enable API)

  • Ở ô tìm kiếm to đùng trên cùng, bác gõ chữ: Text-to-Speech.
  • Bấm vào kết quả Cloud Text-to-Speech API.
  • Bấm nút ENABLE (màu xanh dương) để kích hoạt nó.

Bước 3: Tạo Tài khoản Dịch vụ (Service Account) - Chỗ bác đang vướng đây

  • Nhìn menu bên trái, tìm mục APIs & Services -> chọn Credentials (hình cái chìa khóa).
  • Bấm vào chữ + CREATE CREDENTIALS ở thanh menu ngang trên cùng.
  • Chọn dòng thứ 3: Service account.
  • Service account name: Bác gõ giong-doc-ai.

Bước 4: Xuất file "Chìa khóa" JSON (Quan trọng nhất)

  • Sau khi bấm Done, bác sẽ thấy ở dưới cùng màn hình có mục Service Accounts. Bác sẽ thấy cái email vừa tạo (kiểu giong-doc-ai@...).
  • Bấm chuột thẳng vào cái email đó.
  • Ở trang mới hiện ra, bác nhìn lên các Tab ở trên (Details, Metrics, Permissions...), hãy chọn Tab KEYS.
  • Bấm vào nút ADD KEY -> Chọn Create new key.
  • Chọn định dạng JSON (nó thường chọn sẵn rồi) -> Bấm CREATE.

Bước 5: Đưa vào "Trụ sở" Uptrading

  • Ngay lập tức, máy tính bác sẽ tải về một file tên dài ngoằng (VD: uptrading-voice-12345.json).
  • Bác vào thư mục Downloads, đổi tên file đó thành: google_key.json.
  • Copy file này dán vào thư mục C:\ZaloSignal\

Bước 6: Cập nhật Code Python

  • Kiểm tra xem Đã kích hoạt API chưa: 

    👉 Bấm vào đây để Enable Text-to-Speech API

  • Cài thư viện xịn của Google: Bác mở bảng đen cmd lên, dán lệnh này vào Enter: python -m pip install google-genai google-cloud-texttospeech
  • Bác mở file SanXuat_Content.py lên, xóa hết code cũ và dán đoạn code "Siêu cấp" này vào. Đoạn này mình đã tinh chỉnh để nó nhận diện file JSON của bác và gọi đúng anh MC Neural2-D đĩnh đạc nhất:
import os
import datetime
from google import genai
from google.cloud import texttospeech

# ==========================================
# 1. CẤU HÌNH BỘ NÃO & MC GOOGLE CLOUD
# ==========================================
GOOGLE_API_KEY = "ĐIỀN_API_KEY_GEMINI_CỦA_BÁC_VÀO_ĐÂY"
# Đường dẫn tới file JSON bác vừa tải về os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = r"C:\ZaloSignal\google_key.json" FILE_PATH = r"C:\ZaloSignal\signal.txt" OUTPUT_PATH = r"C:\ZaloSignal\KichBan_Youtube_AI.txt" AUDIO_PATH = r"C:\ZaloSignal\BanTin_Uptradingvn.mp3" def tao_kich_ban_va_thu_am(): if not os.path.exists(FILE_PATH): print("❌ LỖI: Không tìm thấy file signal.txt!") return with open(FILE_PATH, "r", encoding="utf-8") as f: content = f.read().strip() if not content: print("❌ LỖI: File signal.txt trống!") return # Bóc tách mã cổ phiếu signals = content.split("---END---") ma_mua = [] for sig in signals: lines = sig.strip().split('\n') ticker = "" for line in lines: if "Mã:" in line: ticker = line.split("Mã:")[1].split("(")[0].strip() if ticker: ma_mua.append(ticker) danh_sach_ma = ", ".join(ma_mua) ngay_hom_nay = datetime.datetime.now().strftime("%d/%m/%Y") print(f"🔄 ĐANG SOẠN BẢN TIN CHO MÃ: {danh_sach_ma}...") # Ra lệnh cho Gemini viết kịch bản (KỶ LUẬT THÉP) prompt = f""" Bạn là chuyên gia chứng khoán Uptradingvn. Viết kịch bản podcast NGẮN GỌN (dưới 400 chữ) cho ngày {ngay_hom_nay}. Mã nổ Vol hôm nay: {danh_sach_ma} QUY TẮC SỐNG CÒN CHO PHẦN LỜI THOẠI [START_AUDIO] đến [END_AUDIO] (NẾU VI PHẠM SẼ BỊ LỖI HỆ THỐNG): 1. CẤM DÙNG KÝ TỰ ĐẶC BIỆT: Tuyệt đối KHÔNG DÙNG dấu sao (*), dấu thăng (#) hay gạch dưới (_). Khúc này để máy đọc nên chỉ dùng chữ cái và dấu câu (, . ! ?). 2. CÁCH ĐỌC MÃ CỔ PHIẾU CHUẨN: Đánh vần từng chữ cái nối với nhau bằng dấu gạch ngang. - Ví dụ chuẩn: A-Pê-Gờ, Gờ-Ét-Pê, O-Rờ-Ét, Ét-Ca-Gờ. - TUYỆT ĐỐI KHÔNG mở ngoặc đơn để chú thích (Cấm viết: A-Pê-Gờ (APG) -> Chỉ được viết: A-Pê-Gờ). 3. THUẬT NGỮ: Wyckoff = Quai-Cọp, VSA = Vê-Ét-A. 4. Giọng điệu máu lửa, cuốn hút, cuối bài mời vào Room VIP Zalo Uptradingvn. """ try: client = genai.Client(api_key=GOOGLE_API_KEY) response = client.models.generate_content(model='gemini-2.5-flash', contents=prompt) with open(OUTPUT_PATH, "w", encoding="utf-8") as f: f.write(response.text) # Trích xuất đoạn chat để thu âm if "[START_AUDIO]" in response.text: raw_text = response.text.split("[START_AUDIO]")[1].split("[END_AUDIO]")[0].strip() # Trích xuất đoạn chat để thu âm if "[START_AUDIO]" in response.text: raw_text = response.text.split("[START_AUDIO]")[1].split("[END_AUDIO]")[0].strip() # --- BỘ LỌC THÉP: Quét sạch sạn và nắn gân phát âm --- # 1. Xóa ký tự lạ raw_text = raw_text.replace("*", "").replace("#", "").replace("_", "") # 2. Dịch tên thương hiệu sang phiên âm tiếng Việt cho MC dễ đọc raw_text = raw_text.replace("Uptradingvn", "ấp truây đinh vi en") raw_text = raw_text.replace("uptradingvn", "ấp truây đinh vi en") raw_text = raw_text.replace("UPTRADINGVN", "ấp truây đinh vi en") # 3. Nắn gân các thuật ngữ chứng khoán tiếng Anh raw_text = raw_text.replace("Room VIP", "rum víp") raw_text = raw_text.replace("room VIP", "rum víp") raw_text = raw_text.replace("VIP", "víp") raw_text = raw_text.replace("V-I-P", "víp") # Gọi MC Google Cloud Neural2-D # Gọi MC Google Cloud Neural2-D client_tts = texttospeech.TextToSpeechClient() synthesis_input = texttospeech.SynthesisInput(text=raw_text) voice = texttospeech.VoiceSelectionParams(language_code="vi-VN", name="vi-VN-Neural2-D") audio_config = texttospeech.AudioConfig(audio_encoding=texttospeech.AudioEncoding.MP3, speaking_rate=1.05) print("🎧 MC NEURAL2-D ĐANG LÊN SÓNG THU ÂM...") resp = client_tts.synthesize_speech(input=synthesis_input, voice=voice, audio_config=audio_config) with open(AUDIO_PATH, "wb") as out: out.write(resp.audio_content) print(f"✅ THÀNH CÔNG! File âm thanh đã nằm tại: {AUDIO_PATH}") except Exception as e: print(f"⚠️ Có lỗi: {e}") if __name__ == "__main__": tao_kich_ban_va_thu_am() input("\nBấm Enter để kết thúc...")
Chia sẻ:
×
Zoomed Image
Trang Chủ Từ Điển Checklist VIP

Đăng nhập thành công!

Chào mừng Khách hàng VIP đến với
Kho tàng Uptrading.

Zalo Hỗ trợ Zalo Cộng đồng Telegram