惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
罗磊的独立博客
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Recent Announcements
Recent Announcements
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
爱范儿
爱范儿
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
B
Blog RSS Feed

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
实时说外语翻译为中文,说中文翻译为外语
ns2250225 · 2025-12-11 · via V2EX

安装依赖:

pip install azure-cognitiveservices-speech

代码如下:(大家可以换成自己的 key)

import azure.cognitiveservices.speech as speechsdk
import time
import re
from xml.sax.saxutils import escape

def start_voice_interpreter():
    speech_key = "4ahKWCGXqoob2qwwel9HPTebKD0Mk1WMg43EDoaieIPJ6V33XyWGJQQJ99BLACYeBjFXJ3w3AAAYACOGLK1w"
    service_region = "eastus"

    # === 1. 定义支持的语言配置 ===
    # Azure 自动检测最多支持 10 种语言。这里配置了最常用的 9 种外语 + 中文。
    # 格式: (识别语言代码, 翻译目标代码, 语音合成人名称)
    langs_setup = [
        ("zh-CN", "zh-Hans", "zh-CN-XiaoxiaoNeural"), # 中文
        ("en-US", "en",      "en-US-AvaNeural"),      # 英语
        ("ja-JP", "ja",      "ja-JP-NanamiNeural"),   # 日语
        ("ko-KR", "ko",      "ko-KR-SunHiNeural"),    # 韩语
        ("fr-FR", "fr",      "fr-FR-DeniseNeural"),   # 法语
        ("es-ES", "es",      "es-ES-ElviraNeural"),   # 西班牙语
        ("de-DE", "de",      "de-DE-KatjaNeural"),    # 德语
        ("ru-RU", "ru",      "ru-RU-SvetlanaNeural"), # 俄语
        ("it-IT", "it",      "it-IT-ElsaNeural"),     # 意大利语
        ("pt-BR", "pt",      "pt-BR-FranciscaNeural") # 葡萄牙语
    ]
    
    # 提取检测列表 (Azure 限制最多 10 个)
    detect_candidates = [x[0] for x in langs_setup]
    
    # 建立映射方便查找
    # 识别代码 -> 翻译代码 (如 'ja-JP' -> 'ja')
    src_to_target_map = {x[0]: x[1] for x in langs_setup}
    # 翻译代码 -> 发音人 (如 'ja' -> 'ja-JP-NanamiNeural')
    voice_map = {x[1]: x[2] for x in langs_setup}

    # === 2. 初始化配置 ===
    translation_config = speechsdk.translation.SpeechTranslationConfig(
        subscription=speech_key, region=service_region)
    
    # 添加所有语言作为翻译目标 (因为我们可能需要把中文翻译成任何一种外语)
    for _, target_code, _ in langs_setup:
        translation_config.add_target_language(target_code)

    # 自动语言检测配置
    auto_detect_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig(
        languages=detect_candidates
    )

    # 语音合成配置
    tts_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)
    speech_synthesizer = speechsdk.SpeechSynthesizer(speech_config=tts_config)

    # 识别器
    audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)
    recognizer = speechsdk.translation.TranslationRecognizer(
        translation_config=translation_config,
        audio_config=audio_config,
        auto_detect_source_language_config=auto_detect_config
    )

    # 强制连续识别模式
    recognizer.properties.set_property(
        property_id=speechsdk.PropertyId.SpeechServiceConnection_LanguageIdMode, 
        value='Continuous'
    )
    
    # === 状态变量 ===
    # 用于记录“当前对话的外语是什么”。默认英语。
    # 当识别到别人说日语时,这个变量会变成 'ja'。之后你说中文,就会翻译成 'ja'。
    state = {"last_foreign_target": "en"}

    # === 播放函数 ===
    def play_translation(text, language_code):
        voice_name = voice_map.get(language_code, "en-US-AvaNeural")
        # 简单的 XML 转义防止报错
        safe_text = escape(text)
        
        ssml_string = f"""
        <speak version='1.0' xml:lang='{language_code}'>
            <voice name='{voice_name}'>{safe_text}</voice>
        </speak>
        """
        try:
            speech_synthesizer.speak_ssml_async(ssml_string)
        except Exception as e:
            print(f"[播放错误]: {e}")

    # === 结果处理回调 ===
    def result_callback(evt):
        if evt.result.reason == speechsdk.ResultReason.TranslatedSpeech:
            # 获取 Azure 检测到的源语言 (例如 "ja-JP")
            detected_src_lang = evt.result.properties.get(
                speechsdk.PropertyId.SpeechServiceConnection_AutoDetectSourceLanguageResult
            )
            text = evt.result.text
            
            # 找到对应的简写代码 (例如 "ja")
            # Azure 有时返回 "ja-JP" 有时可能带额外信息,这里做个模糊匹配
            current_lang_code = None
            for src_full, target_short, _ in langs_setup:
                if src_full in detected_src_lang:
                    current_lang_code = target_short
                    break
            
            if not current_lang_code:
                print(f">> [忽略]: 无法识别的语言代码 {detected_src_lang}")
                return

            print(f"\n[识别语言]: {detected_src_lang} ({current_lang_code}) | [原文]: {text}")

            # 逻辑分支
            
            # --- 情况 A: 识别到中文 (你自己说话) ---
            if current_lang_code == "zh-Hans":
                # 检查是否误判 (识别为中文但全是英文字母)
                is_latin_text = bool(re.search(r"[a-zA-Z]", text))
                has_chinese_char = bool(re.search(r"[\u4e00-\u9fa5]", text))
                
                if is_latin_text and not has_chinese_char:
                    print(">> [系统警告]: 检测到中文模式,但内容似英文,Azure 可能误判,跳过翻译。")
                    return

                # 正常中文 -> 翻译成“最近一次的外语”
                target_lang = state["last_foreign_target"]
                trans_text = evt.result.translations.get(target_lang, "")
                print(f"[中文 -> {target_lang}]: {trans_text}")
                play_translation(trans_text, target_lang)

            # --- 情况 B: 识别到外语 (对方说话) ---
            else:
                # 更新状态:记住这个外语
                state["last_foreign_target"] = current_lang_code
                
                # 外语 -> 翻译成中文
                target_lang = "zh-Hans"
                trans_text = evt.result.translations.get(target_lang, "")
                print(f"[{current_lang_code} -> 中文]: {trans_text}")
                play_translation(trans_text, target_lang)

    recognizer.recognized.connect(result_callback)
    
    # 开始
    print("--------------------------------------------------")
    print("万能翻译官已启动。")
    print("1. 听到外语(英/日/韩/法/德/西/俄/意/葡) -> 翻译成中文")
    print("2. 听到中文 -> 翻译成刚才那门外语 (默认英语)")
    print("--------------------------------------------------")
    recognizer.start_continuous_recognition()

    try:
        while True: time.sleep(0.5)
    except KeyboardInterrupt:
        recognizer.stop_continuous_recognition()

if __name__ == "__main__":
    start_voice_interpreter()