发布于 2026-01-06 3 阅读
0

🎭⚔️ 修辞竞技场:声音、信念、情感与智慧的较量 🎤🔥 🎯 修辞竞技场

🎭⚔️ 辩论竞技场:声音、信念、情感与智慧的较量 🎤🔥

🎯 修辞竞技场

这是参加AssemblyAI 语音代理挑战赛的作品。

我建造的

隆重推出Rhetoric Arena,这是一个沉浸式、语音驱动、人工智能赋能的辩论平台,专为独行侠、求知欲强的思考者以及所有痴迷于说服、逻辑或公开演讲的人士而设计。在这个竞技场里,你不仅仅是与人工智能对话,而是与它正面交锋

项目首页

用户选择一个辩论主题,表明立场,然后从9个截然不同的AI角色中选择一个,每个角色都有独特的声音、个性和论证风格。辩论随即开始。用户发言后,AssemblyAI的实时转录功能会将语音转换为文本,而由Groq或Gemini驱动的AI对手则会根据你选择的角色,以机智、事实、魅力或愤怒进行反驳。

本项目使用 Flask、Python、JavaScript 和 AssemblyAI 的 Universal-Streaming API 构建,属于领域专家语音代理类别。它使用户能够培养现实生活中的沟通和说服技巧,适应智力压力,并应对真实辩论中的情绪强度,而无需其他人类的参与。它就像一个全天候 24 小时待命、精明强干、冷酷无情的 AI 伙伴🤖🤺。


🎭🤺⚔️ AI角色(辩论对手)

  • 😏 俏皮教练——用戏谑和嘲讽让你产生更好但更令人沮丧的争论。
  • 💥冷酷无情的老兵——逻辑清晰、冷酷无情、毫不留情。
  • 🌸 贴心的朋友——支持和建设性
  • 🕊️甜心天使——总是公平公正,但会挑战薄弱的逻辑
  • ✨你的闺蜜——有趣、轻松、充满力量
  • 💘 魅力对手——风情万种又略带讽刺
  • 🧠 客观人工智能——无情感,纯粹逻辑
  • 📚 严格的老师——会给你打分,并给出反馈
  • 🌌 深邃的哲学家——质疑一切

🌐使用的技术

  1. Python + Flask - 为后端逻辑、路由和管理辩论生命周期提供支持。

  2. AssemblyAI - 使用 Universal-Streaming 处理实时和批量转录。

  3. Groq API - 提供极速 LLM 响应,实现即时辩论回复。

  4. Google Gemini - 当 Groq 运行缓慢或不可用时,充当备用 AI 模型。

  5. JavaScript - 控制音频流、录制和交互式 UI 事件。

  6. HTML/CSS/Tailwind CSS - 打造响应式前端布局和动画,以增强用户体验。


我为什么建造它

因为我性格内向,喜欢独处。
我不太擅长在现实生活中表达自己,尤其是在压力、冲突或争论的时候。
我现在是我们宿舍里年纪最大的。听起来很棒,除非你像我一样:孤身一人,不想和学弟学妹们过多交流。没错,我就是孤身一人。
面试的时候我会很紧张。
我没办法经常练习口语,因为……我又能跟谁说呢?

“修辞竞技场”是我对沉默的反抗。
我创建它是为了让我能够按照自己的方式训练、成长和进化。它是一个全天候智能、响应迅速且情感复杂的AI,它不仅促使我畅所欲言,更促使我思考、表达和捍卫自己的观点。

这不再仅仅是我个人的解决方案了。
我相信它可以帮助任何需要一位无所畏惧的辩论伙伴、一种提升表达能力和大胆发言意愿的人。


演示

项目尚未部署,但我已经录制了一个完整的演示视频,展示了它的强大功能和流畅流程。点击此处观看:


GitHub 仓库

这是我的项目GitHub仓库:

🎯 修辞竞技场

大胆表达你的想法,挑战人工智能,因为只有通过反抗,你的想法才能不断完善,你的声音才能真正成长。

这是一个先进的开源辩论平台,拥有智能AI对手(具有鲜明个性)、实时语音转录、动态文本转语音和全面的论证分析功能。专为开发者、辩手以及所有热爱说服艺术的人士打造。

项目的一些快照:

screencapture-localhost-5000-2025-07-28-01_09_15 screencapture-localhost-5000-2025-07-28-01_09_51

关于本项目

Rhetoric Arena彻底革新了我们练习和完善论证技巧的方式。与静态的辩论工具不同,该平台提供动态的、个性化的AI对手,它们会根据你的论点调整策略,挑战你的推理,并帮助你提升说服力。

无论您是准备参加比赛的学生、磨练演讲技巧的专业人士,还是仅仅热爱理性讨论的人,这款产品都能提供沉浸式体验,使学习论证变得既有趣又有效。

为什么选择修辞竞技场?

  • 9种独特的AI人格:从支持你的朋友到无情的批评家
  • 实时语音处理……

这是一个开源项目。任何人都可以 fork、克隆并在本地运行它。README 文件提供了清晰的说明、设置步骤和故障排除指南。


技术实施与 AssemblyAI 集成

这就是修辞竞技场的核心​​所在💓💓 ,一个结构精巧、层次分明的系统,它能像人类辩手一样聆听、思考和发言。让我们来详细了解一下它的主要组成部分以及它们是如何协同工作的。

这项核心创新基于AssemblyAI 的通用流媒体技术。我实现了实时转录和批量备用转录两种功能,确保用户无论实时还是延迟输入,都能获得转录结果。

1️⃣ 🔁双模式转录(AssemblyAI:实时 + 批量)

import assemblyai as aai
from assemblyai import StreamingClient, StreamingClientOptions
from typing import Callable, List, Dict
import time, re

class DebateTranscriber:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.assemblyai_available = True
        aai.settings.api_key = api_key

    def start_realtime_transcription(self, on_transcript: Callable[[str], None]):
        client = StreamingClient(
            StreamingClientOptions(
                api_key=self.api_key,
                api_host="wss://api.assemblyai.com/v2/realtime/ws?sample_rate=16000"
            )
        )

        def on_data(transcript):
            if transcript.text:
                on_transcript(transcript.text)

        client.on("transcript", on_data)
        client.connect()
        return client
Enter fullscreen mode Exit fullscreen mode

为什么这很重要?
这会打开一个与 AssemblyAI 的实时 WebSocket 连接。每当用户说话时,它都会捕捉用户的声音,实时转录,并直接发送到辩论引擎。回调函数就像一个“ping”——每当转录出新的词语时,它都会通知系统刚才说了什么。零延迟,零等待。

    # 2. Batch Upload Transcription (Fallback)
    def transcribe_audio(self, audio_path: str) -> str:
        if not self.assemblyai_available:
            return "AssemblyAI not available."

        try:
            transcriber = aai.Transcriber()
            transcript = transcriber.transcribe(audio_path)

            while transcript.status != "completed":
                time.sleep(2)
                transcript = transcriber.get_transcription(transcript.id)

            return transcript.text
        except Exception as e:
            return f"[Fallback Error]: {str(e)}"
Enter fullscreen mode Exit fullscreen mode

重要性:
这确保了可靠性。如果实时管道出现故障或出现微故障,系统将回退到传统转录方式。它会上传音频,等待 AssemblyAI 完成处理,然后稍后检索完整文本。无论发生什么,你的声音都不会丢失。


2️⃣ 🗣️🎭语音 + Persona 引擎

class PersonaResponder:
    def __init__(self):
        self.themes = {
            "sassy": {
                "personality": "You're witty, sarcastic, and emotionally expressive. Add spicy comebacks.",
                "voice": "en_sassy_female"
            },
            "stoic": {
                "personality": "You're calm, logical, firm. Never emotional. Use facts.",
                "voice": "en_deep_male"
            }
        }

    def generate_response(self, user_argument: str, topic: str, user_side: str, theme: str, debate_history: List[Dict]) -> str:
        theme_info = self.themes.get(theme, self.themes["stoic"])

        prompt = f"""
{theme_info['personality']}
Debate Topic: "{topic}"
User Said: "{user_argument}"
Your Position: Opposite of {user_side}
Past Rounds: {debate_history}
Respond in character. Focus on rhetoric, logic, emotion.
"""
        ai_response = self._mock_ai_call(prompt)
        return ai_response.strip()

    def _mock_ai_call(self, prompt):
        return f"[AI Rebuttal based on prompt: {prompt[:100]}...]"
Enter fullscreen mode Exit fullscreen mode

为什么这很重要?
这决定了人工智能的战斗方式。每个角色不仅仅是一种语气,而是一个完整的、包含情感和智力特征的个体。无论人工智能是冷静沉着还是热情奔放,这个引擎都能确保它始终保持角色设定,全力以赴,并始终与辩论的氛围相契合。


3️⃣ 🔊带 Persona 语音切换功能的文本转语音

class TTSPlayer:
    def __init__(self):
        self.client = TTSClient()

    def text_to_speech(self, text: str, debate_id: str, theme: str = "stoic"):
        cleaned_text = self._remove_emojis(text)
        voice_id = {
            "sassy": "en_sassy_female",
            "stoic": "en_deep_male"
        }.get(theme, "en_default")

        audio_path = f"./audios/{debate_id}_{theme}.mp3"
        self.client.synthesize(text=cleaned_text, voice_id=voice_id, output_path=audio_path)
        return audio_path

    def _remove_emojis(self, text: str) -> str:
        emoji_pattern = re.compile("["
            u"\U0001F600-\U0001F64F"  # emoticons
            u"\U0001F300-\U0001F5FF"  # symbols & pictographs
            u"\U0001F680-\U0001F6FF"  # transport & map symbols
            u"\U0001F1E0-\U0001F1FF"  # flags
            "]+", flags=re.UNICODE)
        return emoji_pattern.sub(r'', text)
Enter fullscreen mode Exit fullscreen mode

重要性:
每个角色的声音都不同。沉稳的AI听起来深沉而踏实,而活泼的AI则听起来生动而充满活力。这让对话更加真实可信:你仿佛在和一个真实的角色进行辩论。移除表情符号可以避免尴尬的文本转语音(TTS)行为(例如将“😎”读作“戴墨镜的笑脸”)。


4️⃣ 🔄多模型 AI 回退(Groq ➡️⬅️ Gemini)

class AIAgent:
    def _get_ai_response(self, prompt: str, use_groq: bool = True) -> str:
        try:
            if use_groq:
                return self._call_groq(prompt)
            else:
                return self._call_gemini(prompt)

    def _call_groq(self, prompt):
        return f"Groq AI Response for: {prompt[:60]}..."

    def _call_gemini(self, prompt):
        return f"Gemini AI Response for: {prompt[:60]}..."

Enter fullscreen mode Exit fullscreen mode

为什么这很重要?
这增强了系统的韧性。如果某个人工智能提供商出现延迟或故障,系统会立即切换到另一个。Groq 速度极快,而 Gemini 则拥有丰富的对话功能。无论发生什么,你的辩论都不会中断。


5️⃣ 🎤 JavaScript 音频捕获(前端语音录制器)

async function startRecording() {
  const stream = await navigator.mediaDevices.getUserMedia({
    audio: {
      echoCancellation: true,
      noiseSuppression: true,
    }
  });

  const mediaRecorder = new MediaRecorder(stream);
  mediaRecorder.start();

  const audioChunks = [];
  mediaRecorder.ondataavailable = event => {
    audioChunks.push(event.data);
  };

  mediaRecorder.onstop = () => {
    const audioBlob = new Blob(audioChunks);
    const audioUrl = URL.createObjectURL(audioBlob);
  };
}
Enter fullscreen mode Exit fullscreen mode

为什么这很重要?
这项功能允许用户直接通过浏览器录制语音,并具备降噪和回声消除功能。录制结束后,音频会像直播流一样上传和处理。前端界面会变成一个简洁的实时平台,用户可以在这里发言、聆听自己的声音,并与人工智能进行互动。


最后想说的话

“修辞竞技场”不仅仅是一个项目,
更是一次对沉默的个人反抗,也是献给每一个内向者、每一个求知欲强的学习者、每一个求职者、每一个渴望被倾听、被辩论、被磨砺的灵魂的礼物。

别再等待别人挑战你的想法。
别再因为害怕词穷而保持沉默。

有了这项人工智能技术,你将始终拥有:

  • 一个值得尊敬的对手
  • 一位聪明的教练
  • 一位勇敢的朋友
  • 以及一个永远不会让你停止成长的人。

无论你是想提升演讲技巧、准备面试,还是仅仅想增强勇气——“踏入修辞竞技场”。人工智能正等着你。

✨ 由 Divya 倾注热情、坚持和目标打造。
献给每一位内心平静却渴望表达自我的人。

感谢你读到最后🥹✨😊

谢谢你的gif

文章来源:https://dev.to/divyasinghdev/rhetoric-arena-battle-of-voices-beliefs-emotions-brains-23fj