前言

在直播行业快速发展的今天,主播与观众的互动变得越来越重要。为了提升直播体验,我开发了一个基于Python的快手直播评论实时语音播报系统,可以自动监听直播间的评论并通过语音播报出来,让主播不用一直盯着屏幕也能及时了解观众的互动内容。本文将详细介绍该系统的实现原理、核心代码和使用方法。

系统功能介绍

该系统主要实现以下功能:

  1. 自动登录快手直播平台:通过保存的cookies实现免登录访问
  2. 直播间URL管理:可保存多个主播的直播间地址,方便下次访问
  3. 实时评论监听:使用JavaScript监听DOM变化,捕获直播间的实时评论
  4. 文本转语音:利用Edge TTS将评论文本转换为自然流畅的语音
  5. 实时语音播报:支持两种播放模式,可选择生成完成后播放或边生成边播放

技术栈

本项目使用了以下技术和库:

  • DrissionPage:用于浏览器自动化控制,监听直播评论
  • edge-tts:微软Edge浏览器的文本转语音服务
  • PyAudio:用于音频流的处理和播放
  • pydub:音频文件处理库,用于MP3格式的处理和播放

系统架构

系统主要分为两个部分:

  1. 评论监听模块:使用DrissionPage控制浏览器,通过JavaScript监听DOM变化,捕获直播间的实时评论
  2. 语音播报模块:使用edge-tts将评论文本转换为语音,并通过PyAudio和pydub实现实时播放

核心代码实现

1. 评论监听模块

评论监听模块使用DrissionPage控制浏览器,通过JavaScript监听DOM变化,捕获直播间的实时评论:

# 初始化浏览器
brower = Chromium()
page = brower.latest_tab
# 打开直播间
page.get(url)

# 启动控制台监听
console = page.console.start()

# 注入JavaScript代码监听评论
page.run_js(r"const targetNode = document.querySelector('#liveroom__sidebar > div.flex-col.flex-1.wrapper > div.flex-col.relative.flex-1.of-h > div.chat-history.flex-col > div.wrapper.flex-1.flex-col > div > div:nth-child(2)');const config = { childList: true, subtree: true };const callback = (mutationsList) => {for (const mutation of mutationsList) {if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {mutation.addedNodes.forEach(node => {if (node.querySelector && node.querySelector('.comment-cell')) {const commentCell = node.querySelector('.comment-cell');let username = commentCell.querySelector('.username')?.textContent || '未知用户';username = username.slice(0, username.length - 1);const commentContent = commentCell.querySelector('.comment');let commentText = '';if (commentContent) {const textNodes = [];const walker = document.createTreeWalker(commentContent,NodeFilter.SHOW_TEXT,null,false);let node;while (node = walker.nextNode()) {if (node.nodeValue.trim() !== '') {textNodes.push(node.nodeValue.trim());}};commentText = textNodes.join(' ');}console.log(`${username} 评论: ${commentText}`);}});}}}; const observer = new MutationObserver(callback); observer.observe(targetNode, config);",as_expr=True)

# 循环监听评论并调用语音服务
while True:
    contents = page.console.wait(10)
    if '评论' in contents.text:
        # 调用语音服务
        asyncio.run(main(contents.text))
    continue

2. 语音播报模块

语音播报模块使用edge-tts将评论文本转换为语音,并通过PyAudio和pydub实现实时播放:

async def stream_speech_with_realtime_playback(text, voice='zh-CN-YunxiNeural'):
    """使用临时文件实现真正的实时播放"""
    
    # 创建临时文件
    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.mp3')
    temp_file.close()
    
    try:
        # 创建通信对象
        communicate = edge_tts.Communicate(text, voice)
        
        # 获取语音流并实时播放
        current_segment = 0
        buffer = b''
        segment_files = []
        
        async for chunk in communicate.stream():
            if chunk["type"] == "audio":
                buffer += chunk["data"]

                if len(buffer) >= 8192:  # 约0.5秒的音频
                    
                    segment_file = f"{temp_file.name}.part{current_segment}"
                    segment_files.append(segment_file)
                    
                    with open(segment_file, 'wb') as f:
                        f.write(buffer)

                    asyncio.create_task(play_segment(segment_file))

                    buffer = b''
                    current_segment += 1
        
        if buffer:
            segment_file = f"{temp_file.name}.part{current_segment}"
            segment_files.append(segment_file)
            
            with open(segment_file, 'wb') as f:
                f.write(buffer)
            
            await play_segment(segment_file)
        
        await asyncio.sleep(1)
        
    finally:
    
        try:
            os.unlink(temp_file.name)
            for segment_file in segment_files:
                if os.path.exists(segment_file):
                    os.unlink(segment_file)
        except:
            pass

使用方法

环境准备

  1. 安装所需的Python库:
pip install -r requirement.txt
  1. 准备cookies.json文件(包含快手账号的登录信息)

运行步骤

  1. 运行app.py文件:
python app.py
  1. 根据提示输入快手直播间URL或选择已保存的主播

  2. 系统将自动监听直播间评论并进行语音播报

系统优化与扩展

已实现的优化

  1. URL管理:保存访问过的主播直播间URL,方便下次访问
  2. 实时播放:支持边生成边播放的实时语音播报模式
  3. 多种音色:支持选择不同的语音音色

可扩展的功能

  1. 关键词过滤:可以添加关键词过滤功能,只播报包含特定关键词的评论
  2. 用户权限:可以设置只播报特定用户(如管理员、VIP用户)的评论
  3. 语音定制:可以根据不同类型的评论使用不同的语音音色
  4. 数据统计:记录评论数据,生成互动统计报表
  5. 多平台支持:扩展支持其他直播平台,如抖音、哔哩哔哩等

总结

本文介绍了一个基于Python的快手直播评论实时语音播报系统,该系统通过DrissionPage控制浏览器监听直播间评论,并使用edge-tts将评论转换为语音进行播报。系统实现了自动登录、URL管理、实时评论监听和语音播报等功能,可以有效提升主播与观众的互动体验。

该项目展示了如何结合浏览器自动化、DOM监听和语音合成技术,实现一个实用的直播辅助工具。通过这个项目,我们不仅可以学习到这些技术的应用,还可以了解如何将它们有机地结合起来,构建一个完整的应用系统。

希望这个项目能对从事直播行业或对相关技术感兴趣的朋友有所帮助!

参考资料

  1. DrissionPage官方文档
  2. edge-tts项目
  3. PyAudio文档
  4. pydub项目
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐