import subprocess
import sys
import time

# 核心语音函数
def speak(文本, 语速=150, 语言="zh"):
    """文本转语音功能"""
    try:
        subprocess.run(["espeak", "--version"], check=True, capture_output=True)
    except (subprocess.CalledProcessError, FileNotFoundError):
        print("错误：未安装espeak，请先安装", file=sys.stderr)
        return
    
    subprocess.run([
        "espeak",
        f"-v{语言}",
        f"-s{语速}",
        文本
    ])


# 1. 结合打印的语音播报（fprint + speak）
def dprint(文本, 打印延迟=0.1, 语速=150, 语言="zh"):
    """彩虹色打印后自动朗读"""
    颜色列表 = [
        '\033[91m', '\033[92m', '\033[93m',
        '\033[94m', '\033[95m', '\033[96m'
    ]
    for 索引, 字符 in enumerate(文本):
        颜色 = 颜色列表[索引 % len(颜色列表)]
        print(f"{颜色}{字符}", end='', flush=True)
        time.sleep(打印延迟)
    print('\033[0m')  # 重置颜色
    speak(文本, 语速, 语言)  # 触发语音


# 2. 输入交互 + 语音（dinput + speak）
def dinput(提示文本, 语速=150, 语言="zh"):
    """提示文本语音播报后接收输入"""
    speak(提示文本, 语速, 语言)  # 先朗读提示
    return input(提示文本)  # 再接收输入


# 3. 快速打印 + 语音（fast_fprint + speak）
def fdprint(文本, 打印延迟=0.001, 语速=180, 语言="zh"):
    """快速彩虹打印后朗读（适合长文本）"""
    颜色列表 = [
        '\033[91m', '\033[92m', '\033[93m',
        '\033[94m', '\033[95m', '\033[96m'
    ]
    for 索引, 字符 in enumerate(文本):
        颜色 = 颜色列表[索引 % len(颜色列表)]
        print(f"{颜色}{字符}", end='', flush=True)
        time.sleep(打印延迟)
    print('\033[0m')
    speak(文本, 语速, 语言)  # 语速稍快匹配打印速度


# 4. 带语音的输入确认（fdinput + speak）
def fdinput(确认文本, 语速=150, 语言="zh"):
    """朗读确认文本后等待用户确认输入"""
    speak(f"请确认：{确认文本}", 语速, 语言)
    输入 = input(f"{确认文本}（输入任意内容确认）：")
    speak(f"已收到：{输入}", 语速, 语言)
    return 输入


# 使用示例
if __name__ == "__main__":
    fprint_speak("欢迎使用语音交互工具！")
    姓名 = dinput_speak("请输入您的姓名：")
    fast_fprint_speak(f"您好，{姓名}！正在为您加载功能...")
    fdinput_speak(f"确认用户姓名为：{姓名}")
