CosyVoice与爬虫技术结合:自动抓取新闻并生成语音日报

张开发
2026/4/30 16:23:32 15 分钟阅读

分享文章

CosyVoice与爬虫技术结合:自动抓取新闻并生成语音日报
CosyVoice与爬虫技术结合自动抓取新闻并生成语音日报每天早上你是不是也和我一样一边洗漱、吃早餐一边想快速了解昨晚到今天发生了什么大事但手机屏幕太小看文字新闻又费眼睛通勤路上更不方便。要是有人能把新闻“念”给你听就好了。今天要聊的就是怎么用技术解决这个痛点。我们不用等别人来做自己动手搭建一个完全自动化的“语音新闻日报”系统。它的核心流程很简单让程序自动去网上抓取最新的新闻整理成简洁的摘要然后用一个叫CosyVoice的语音合成模型把文字变成一段流畅的语音。整个过程从抓取到生成完全不需要人工干预每天定点为你播报。听起来有点复杂别担心我会用最直白的方式带你一步步走通这个全链路。你会发现把爬虫和语音合成这两个技术点串起来能做出非常实用的东西。1. 为什么需要自动化的语音新闻在深入技术细节之前我们先看看这件事到底能带来什么价值。你可能会想现在新闻App不都有语音播报功能吗没错但那些功能往往是平台统一的你可能无法选择自己关心的新闻源或者播报的音色、语速并不合你胃口。我们自己搭建的系统优势就在于“完全定制”。你可以指定只抓取科技、财经或者体育领域的新闻可以设定在每天早上7点半准时把语音文件推送到你的手机或智能音箱甚至可以调整语音的风格是用沉稳的男声播报财经资讯还是用亲切的女声讲述生活趣闻。这种灵活性和掌控感是通用App很难提供的。从技术整合的角度看这个项目也是一个很好的练手机会。它涉及了从数据获取爬虫、数据处理文本清洗与摘要、到数据输出语音合成的完整流水线涵盖了后端开发的几个关键环节。跑通它你对如何构建一个自动化内容生产系统会有更直观的理解。2. 搭建你的新闻抓取器爬虫部分整个系统的第一步是获取新闻原材料。这里我们会用到Python爬虫技术。放心我们只抓取公开的、允许访问的新闻网站数据并且会控制频率做一个有礼貌的“采集者”。2.1 选择合适的工具库Python里做爬虫有很多现成的轮子我们选两个最常用、也最简单的requests用来向网站发送请求获取网页的原始代码HTML。BeautifulSoup用来解析那一大坨HTML代码像一把手术刀精准地从中提取出我们需要的新闻标题和正文。安装它们只需要一行命令pip install requests beautifulsoup42.2 编写一个简单的新闻抓取脚本假设我们想抓取一个新闻网站的“科技”板块。核心思路是请求网页 - 解析HTML - 找到新闻条目 - 提取标题和链接。下面是一个高度简化的示例展示了这个核心过程import requests from bs4 import BeautifulSoup def fetch_tech_news(): # 1. 定义目标网址 url https://example-news-site.com/tech # 2. 发送网络请求获取网页内容 # 设置一个headers模拟浏览器访问避免被简单屏蔽 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() # 检查请求是否成功 except requests.RequestException as e: print(f抓取网页失败: {e}) return [] # 3. 用BeautifulSoup解析HTML soup BeautifulSoup(response.text, html.parser) # 4. 提取新闻条目这里需要根据实际网站结构调整选择器 # 假设每个新闻都在一个 classnews-item 的div里 news_items soup.find_all(div, class_news-item) news_list [] for item in news_items[:5]: # 只取最新的5条 # 提取标题 title_tag item.find(h2, class_title) title title_tag.get_text(stripTrue) if title_tag else 无标题 # 提取摘要或链接这里以链接为例 link_tag item.find(a, hrefTrue) link link_tag[href] if link_tag else # # 简单处理将相对链接转为绝对链接 if link.startswith(/): link fhttps://example-news-site.com{link} news_list.append({ title: title, link: link }) return news_list if __name__ __main__: news fetch_tech_news() for i, n in enumerate(news, 1): print(f{i}. {n[title]} - {n[link]})这段代码在干什么它模拟浏览器访问了一个新闻网站然后把网页代码“翻译”成我们能理解的结构最后挑出新闻标题和链接。你需要做的就是用浏览器的“检查元素”功能去看看你想抓的网站它的新闻标题和链接藏在哪个HTML标签里然后替换掉代码里的news-item、h2这些选择器。2.3 让抓取更“友好”和稳定直接运行上面的代码可能会遇到问题比如网站拒绝访问或者页面结构变了。所以我们得加点“佐料”异常处理网络请求可能失败解析可能出错代码里要用try...except包起来避免程序崩溃。设置间隔在连续抓取不同页面时用time.sleep(2)这样的语句暂停几秒减轻对方网站的压力。伪装头部上面的headers就是让我们的请求看起来更像一个真正的浏览器。处理动态内容有些网站用JavaScript加载新闻requests抓不到。这时可能需要用到Selenium这样的工具来模拟浏览器操作但复杂度会提高。初期建议先从静态页面练手。抓取到的新闻标题和链接我们先存到一个列表或者字典里这就是我们语音播报的“原料”。3. 从文字到声音CosyVoice语音合成原料有了下一步就是把它变成声音。这里我们请出今天的主角之一CosyVoice。它是一个开源的语音合成模型效果不错而且可以在自己的电脑或服务器上运行不用担心隐私问题。3.1 快速启动CosyVoiceCosyVoice通常提供了比较方便的部署方式比如Docker镜像。假设我们已经通过类似星图镜像广场这样的平台一键部署好了CosyVoice服务它会在本地的某个端口比如8000提供一个API接口。合成语音的核心就是向这个接口发送一段文字然后它返回一段音频文件。3.2 编写语音合成客户端我们的Python程序需要调用这个API。这比爬虫还要简单本质上就是一次HTTP POST请求。import requests import json import datetime def text_to_speech_with_cosyvoice(text, output_filenamenews_audio.wav): 调用CosyVoice服务将文本合成为语音文件。 # 1. CosyVoice API的地址根据实际部署情况修改 api_url http://localhost:8000/tts # 2. 准备请求数据 # 通常需要文本内容和一些参数如音色、语速 payload { text: text, speaker: zh-CN-XiaoxiaoNeural, # 示例音色需查看CosyVoice支持列表 speed: 1.0, # 语速1.0为正常 format: wav } headers { Content-Type: application/json } try: # 3. 发送合成请求 response requests.post(api_url, datajson.dumps(payload), headersheaders, timeout30) if response.status_code 200: # 4. 保存返回的音频文件 with open(output_filename, wb) as f: f.write(response.content) print(f语音文件已生成: {output_filename}) return True else: print(f语音合成失败状态码: {response.status_code}, 返回: {response.text}) return False except requests.RequestException as e: print(f调用语音合成API失败: {e}) return False # 示例合成一条新闻标题 if __name__ __main__: news_text 今日科技头条人工智能助力天气预报精度大幅提升。 # 生成带时间戳的文件名避免覆盖 filename fnews_{datetime.datetime.now().strftime(%Y%m%d_%H%M)}.wav text_to_speech_with_cosyvoice(news_text, filename)这段代码在干什么它把一段文字比如新闻标题打包发送给在我们本地运行的CosyVoice服务。CosyVoice“吃”下这段文字“吐出”一段WAV格式的音频数据我们再把这段数据保存成文件。你就得到了一条可以播放的语音新闻。3.3 调整声音让它更好听你可能注意到了payload里的speaker和speed。这就是定制化的关键speaker选择不同的发音人。CosyVoice可能提供多种音色比如男声、女声、童声你可以选一个最喜欢的。speed调整播报语速。1.0是正常速度1.2会快一点0.8会慢一点根据你的听力习惯来调。其他参数有些高级模型还支持调整语调、情感等可以让播报听起来更自然、更有感染力。这需要你查阅CosyVoice的具体文档。4. 把一切串联起来自动化流水线现在我们有了左手爬虫抓新闻和右手CosyVoice读新闻是时候让它们协调工作了。我们需要一个“大脑”来调度每天定时触发抓取处理文本调用合成最后把成品语音发给我们。4.1 设计每日工作流一个完整的自动化脚本大概要做这些事定时启动设定在每天早上7点运行。抓取新闻调用我们写好的爬虫函数获取最新5-10条新闻。文本处理把抓来的多条新闻标题和摘要拼接成一段连贯的播报文稿。比如加上“今天是X月X日为您带来最新资讯...”的开场白在每条新闻间加上停顿。合成语音将这篇完整的文稿交给CosyVoice生成一个完整的语音文件。交付成果把生成的语音文件保存到指定文件夹或者通过邮件、即时通讯工具如Telegram Bot、企业微信机器人发送给自己。4.2 核心调度脚本示例下面是一个高度整合的、概念性的主程序框架import datetime import time from your_crawler_module import fetch_tech_news # 导入之前写的爬虫函数 from your_tts_module import text_to_speech_with_cosyvoice # 导入之前写的TTS函数 def generate_daily_voice_news(): 每日语音新闻生成任务 print(f{datetime.datetime.now()} 开始生成每日语音新闻...) # 1. 抓取新闻 print(正在抓取最新科技新闻...) news_list fetch_tech_news() if not news_list: print(今日未抓取到新闻任务结束。) return # 2. 撰写播报文稿 print(正在撰写播报文稿...) today_str datetime.datetime.now().strftime(%Y年%m月%d日) script_lines [f早上好今天是{today_str}为您播报最新的科技资讯。] for idx, news in enumerate(news_list, 1): # 简单处理这里只播报标题。你也可以尝试抓取摘要让内容更丰富。 script_lines.append(f第{idx}条{news[title]}。) script_lines.append(以上就是今日晨间快讯祝您有愉快的一天。) full_script .join(script_lines) # 合并成一段文本 # 3. 合成语音 print(正在合成语音...) filename fdaily_news_{datetime.datetime.now().strftime(%Y%m%d)}.wav success text_to_speech_with_cosyvoice(full_script, filename) if success: print(f今日语音新闻已成功生成: {filename}) # 4. 可选在这里添加发送文件的代码如通过邮件附件发送 # send_via_email(filename) else: print(语音新闻生成失败。) def main(): 主调度函数 # 方式一立即运行一次用于测试 # generate_daily_voice_news() # 方式二定时运行例如每天07:00运行 while True: now datetime.datetime.now() if now.hour 7 and now.minute 0: generate_daily_voice_news() # 为了避免一小时内多次触发执行后休眠一段时间 time.sleep(3600) # 休眠1小时 else: # 每分钟检查一次时间 time.sleep(60) if __name__ __main__: main()这个脚本就像一个自动化的工厂流水线控制器。你可以先注释掉定时循环的部分手动运行generate_daily_voice_news()函数来测试整个流程是否畅通。测试成功后再启用定时循环把它部署到一台一直开着的电脑或服务器上它就能每天准时为你工作了。5. 实际应用中的优化与思考把基础版本跑起来后你可以根据实际体验从多个角度让它变得更好用。内容质量方面摘要生成只播报标题可能信息量不够。可以尝试在抓取新闻链接后再深入抓取一下正文的前几句作为摘要或者使用简单的文本摘要算法虽然会复杂一些来提炼核心内容。分类过滤你可能不只关心科技新闻。可以同时抓取多个板块财经、体育、国际然后在文稿中分章节播报。去重与排序确保每天抓取的是新新闻并且把最重要的新闻放在前面播报。技术稳定性方面错误重试网络请求可能偶尔失败给爬虫和TTS调用加上重试机制。日志记录把每天抓取了多少条新闻、合成是否成功、文件保存在哪都记录到一个日志文件里方便出问题时排查。资源管理定期清理旧的语音文件避免磁盘被占满。用户体验方面多播报风格根据新闻类型切换音色。比如用严肃的男声播财经用轻快的女声播娱乐。推送方式把最终生成的语音文件通过你常用的工具比如微信、钉钉、Telegram的机器人自动推送到手机实现“无感”接收。6. 总结走完这一趟你会发现把一个想法变成可运行的自动化服务并没有想象中那么遥不可及。我们用了爬虫来获取信息用CosyVoice来转换信息的表现形式再用一个Python脚本把它们粘合起来并加上定时触发。这就构成了一个能实实在在每天为你提供价值的小系统。这个项目的意义不止于得到一个语音新闻工具。它更是一个样板展示了如何将不同的AI能力如语音合成与传统的自动化技术如爬虫、定时任务相结合去解决一个具体的场景问题。你可以把这个模式复制到很多地方比如自动抓取行业报告生成摘要音频、监控商品价格变动并语音提醒、甚至是为你喜欢的网络小说自动生成有声书章节。技术本身是模块化的重要的是你怎么发现需求并把它们像拼积木一样组合起来。希望这个案例能给你带来一些启发。动手去试试从抓取一个你常看的新闻网站开始听听CosyVoice合成的第一句播报那种自己创造出一个“小助手”的感觉还是挺棒的。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章