Qwen3-ASR-0.6B语音数据集清洗:MySQL存储优化方案
Qwen3-ASR-0.6B语音数据集清洗MySQL存储优化方案1. 引言语音识别技术正在快速发展Qwen3-ASR-0.6B作为阿里开源的轻量级语音识别模型支持52种语言和方言的识别在保证准确率的同时实现了出色的性能表现。在实际应用中我们经常需要处理海量的语音识别数据如何高效地存储和管理这些数据成为了一个关键问题。本文将带你从零开始构建一个完整的语音数据存储解决方案。我们会使用MySQL数据库来存储Qwen3-ASR-0.6B处理后的语音识别结果并通过合理的分表策略、索引优化和自动化流程设计确保系统能够高效处理大规模数据。无论你是刚接触数据库的开发者还是需要处理语音数据的工程师这篇文章都会提供实用的技术方案和可运行的代码示例。2. 环境准备与数据库设计2.1 系统要求与MySQL安装首先确保你的系统已经安装了MySQL 8.0或更高版本。如果还没有安装可以使用以下命令在Ubuntu系统上安装# 更新包列表 sudo apt update # 安装MySQL服务器 sudo apt install mysql-server # 启动MySQL服务 sudo systemctl start mysql # 设置MySQL开机自启 sudo systemctl enable mysql # 运行安全安装脚本 sudo mysql_secure_installation对于Windows用户可以从MySQL官网下载安装包进行安装。2.2 数据库表结构设计接下来我们设计存储语音识别结果的数据表结构。考虑到数据量可能很大我们采用分表策略按月分表存储数据。首先创建主数据库CREATE DATABASE IF NOT EXISTS asr_data CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE asr_data;创建主表结构后续会基于这个结构创建月度分表CREATE TABLE asr_results_template ( id BIGINT AUTO_INCREMENT PRIMARY KEY, audio_id VARCHAR(64) NOT NULL COMMENT 音频文件唯一标识, audio_path VARCHAR(500) NOT NULL COMMENT 音频文件存储路径, audio_duration FLOAT NOT NULL COMMENT 音频时长秒, language_detected VARCHAR(10) COMMENT 检测到的语言代码, transcript_text LONGTEXT NOT NULL COMMENT 识别文本内容, confidence_score FLOAT COMMENT 识别置信度, processing_time FLOAT NOT NULL COMMENT 处理耗时秒, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, INDEX idx_audio_id (audio_id), INDEX idx_language (language_detected), INDEX idx_created_at (created_at), FULLTEXT INDEX idx_transcript_text (transcript_text) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci;3. 分表策略与自动化管理3.1 按月分表方案对于海量语音数据单表存储会导致查询性能下降。我们采用按月分表的策略每个月创建一个新的数据表。创建分表管理表CREATE TABLE table_management ( table_name VARCHAR(50) PRIMARY KEY, table_suffix VARCHAR(10) NOT NULL COMMENT 表后缀如202401, created_date DATE NOT NULL, record_count INT DEFAULT 0, last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );3.2 自动分表创建函数创建一个存储过程来自动化管理分表DELIMITER // CREATE PROCEDURE create_monthly_table_if_not_exists(IN table_suffix VARCHAR(6)) BEGIN DECLARE table_name VARCHAR(50); DECLARE table_exists INT; SET table_name CONCAT(asr_results_, table_suffix); -- 检查表是否已存在 SELECT COUNT(*) INTO table_exists FROM information_schema.tables WHERE table_schema asr_data AND table_name table_name; IF table_exists 0 THEN -- 创建新月份的表 SET create_sql CONCAT( CREATE TABLE , table_name, LIKE asr_results_template ); PREPARE stmt FROM create_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; -- 记录到管理表 INSERT INTO table_management (table_name, table_suffix, created_date) VALUES (table_name, table_suffix, CURDATE()); SELECT CONCAT(Created new table: , table_name) AS result; ELSE SELECT CONCAT(Table already exists: , table_name) AS result; END IF; END// DELIMITER ;3.3 月度分表维护脚本创建一个Python脚本来自动维护月度分表import mysql.connector from datetime import datetime import logging # 配置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) def manage_monthly_tables(): 自动创建和管理月度分表 try: # 连接数据库 conn mysql.connector.connect( hostlocalhost, useryour_username, passwordyour_password, databaseasr_data ) cursor conn.cursor() # 获取当前年月 current_year_month datetime.now().strftime(%Y%m) # 调用存储过程创建新表如果不存在 cursor.callproc(create_monthly_table_if_not_exists, [current_year_month]) # 获取存储过程结果 for result in cursor.stored_results(): logging.info(result.fetchone()[0]) conn.commit() logging.info(Monthly table management completed successfully) except mysql.connector.Error as err: logging.error(fDatabase error: {err}) except Exception as e: logging.error(fUnexpected error: {e}) finally: if conn.is_connected(): cursor.close() conn.close() if __name__ __main__: manage_monthly_tables()4. 数据插入与查询优化4.1 批量数据插入函数为了提高数据插入效率我们实现批量插入功能import mysql.connector from mysql.connector import Error from datetime import datetime class ASRDataManager: def __init__(self, host, user, password, database): self.host host self.user user self.password password self.database database self.connection None def connect(self): 建立数据库连接 try: self.connection mysql.connector.connect( hostself.host, userself.user, passwordself.password, databaseself.database, charsetutf8mb4, collationutf8mb4_unicode_ci ) return True except Error as e: print(f连接数据库失败: {e}) return False def get_current_table_name(self): 获取当前月份的表名 current_suffix datetime.now().strftime(%Y%m) return fasr_results_{current_suffix} def batch_insert_results(self, results): 批量插入识别结果 if not self.connect(): return False table_name self.get_current_table_name() insert_query f INSERT INTO {table_name} (audio_id, audio_path, audio_duration, language_detected, transcript_text, confidence_score, processing_time) VALUES (%s, %s, %s, %s, %s, %s, %s) try: cursor self.connection.cursor() cursor.executemany(insert_query, results) self.connection.commit() print(f成功插入 {cursor.rowcount} 条记录) return True except Error as e: print(f插入数据失败: {e}) self.connection.rollback() return False finally: if self.connection.is_connected(): cursor.close() self.connection.close() def search_transcripts(self, search_text, limit10): 全文搜索转录文本 if not self.connect(): return [] search_query SELECT audio_id, transcript_text, confidence_score, created_at FROM asr_results WHERE MATCH(transcript_text) AGAINST(%s IN NATURAL LANGUAGE MODE) ORDER BY created_at DESC LIMIT %s try: cursor self.connection.cursor(dictionaryTrue) cursor.execute(search_query, (search_text, limit)) results cursor.fetchall() return results except Error as e: print(f搜索失败: {e}) return [] finally: if self.connection.is_connected(): cursor.close() self.connection.close() # 使用示例 if __name__ __main__: # 初始化数据管理器 db_manager ASRDataManager(localhost, your_username, your_password, asr_data) # 示例数据 sample_data [ (audio_001, /path/to/audio1.wav, 15.5, zh, 今天天气很好适合外出散步, 0.92, 2.1), (audio_002, /path/to/audio2.wav, 8.2, en, Hello, how are you doing today?, 0.88, 1.8) ] # 批量插入数据 db_manager.batch_insert_results(sample_data) # 搜索示例 search_results db_manager.search_transcripts(天气, 5) for result in search_results: print(f音频ID: {result[audio_id]}, 文本: {result[transcript_text]})4.2 数据清洗与去重功能为了避免重复存储相同内容添加数据清洗和去重功能class ASRDataCleaner(ASRDataManager): def __init__(self, host, user, password, database): super().__init__(host, user, password, database) def remove_duplicates(self, table_name): 删除重复的音频记录 if not self.connect(): return False deduplication_query f DELETE t1 FROM {table_name} t1 INNER JOIN {table_name} t2 WHERE t1.id t2.id AND t1.audio_id t2.audio_id try: cursor self.connection.cursor() cursor.execute(deduplication_query) removed_count cursor.rowcount self.connection.commit() print(f已删除 {removed_count} 条重复记录) return True except Error as e: print(f去重失败: {e}) self.connection.rollback() return False finally: if self.connection.is_connected(): cursor.close() self.connection.close() def clean_low_confidence_data(self, confidence_threshold0.5): 清理低置信度的数据 if not self.connect(): return False current_table self.get_current_table_name() cleanup_query f DELETE FROM {current_table} WHERE confidence_score %s OR confidence_score IS NULL try: cursor self.connection.cursor() cursor.execute(cleanup_query, (confidence_threshold,)) removed_count cursor.rowcount self.connection.commit() print(f已删除 {removed_count} 条低置信度记录) return True except Error as e: print(f清理失败: {e}) self.connection.rollback() return False finally: if self.connection.is_connected(): cursor.close() self.connection.close()5. 性能优化与索引策略5.1 索引优化建议为了提高查询性能我们需要为常用查询字段创建合适的索引-- 为按月分表添加优化索引 ALTER TABLE asr_results_202401 ADD INDEX idx_audio_duration (audio_duration); ALTER TABLE asr_results_202401 ADD INDEX idx_processing_time (processing_time); ALTER TABLE asr_results_202401 ADD INDEX idx_confidence_score (confidence_score); -- 创建复合索引用于常用查询 ALTER TABLE asr_results_202401 ADD INDEX idx_language_confidence (language_detected, confidence_score); ALTER TABLE asr_results_202401 ADD INDEX idx_created_audio (created_at, audio_id);5.2 查询性能优化实现一个优化的查询类支持多种查询方式class ASRQueryOptimizer(ASRDataManager): def __init__(self, host, user, password, database): super().__init__(host, user, password, database) def get_results_by_time_range(self, start_date, end_date, limit100): 按时间范围查询结果 if not self.connect(): return [] query SELECT * FROM asr_results WHERE created_at BETWEEN %s AND %s ORDER BY created_at DESC LIMIT %s try: cursor self.connection.cursor(dictionaryTrue) cursor.execute(query, (start_date, end_date, limit)) return cursor.fetchall() except Error as e: print(f时间范围查询失败: {e}) return [] def get_language_statistics(self, days30): 获取语言使用统计 if not self.connect(): return {} query SELECT language_detected, COUNT(*) as count, AVG(confidence_score) as avg_confidence FROM asr_results WHERE created_at DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY language_detected ORDER BY count DESC try: cursor self.connection.cursor(dictionaryTrue) cursor.execute(query, (days,)) return cursor.fetchall() except Error as e: print(f统计查询失败: {e}) return {} def export_to_csv(self, output_file, batch_size1000): 导出数据到CSV文件 if not self.connect(): return False try: import csv offset 0 with open(output_file, w, newline, encodingutf-8) as csvfile: fieldnames [audio_id, audio_duration, language_detected, transcript_text, confidence_score, created_at] writer csv.DictWriter(csvfile, fieldnamesfieldnames) writer.writeheader() while True: query f SELECT {, .join(fieldnames)} FROM asr_results ORDER BY id LIMIT %s OFFSET %s cursor self.connection.cursor(dictionaryTrue) cursor.execute(query, (batch_size, offset)) batch cursor.fetchall() if not batch: break writer.writerows(batch) offset batch_size print(f已导出 {offset} 条记录) print(f数据导出完成共 {offset} 条记录) return True except Error as e: print(f导出失败: {e}) return False6. 完整实战示例6.1 集成Qwen3-ASR-0.6B的完整流程下面是一个完整的示例展示如何将Qwen3-ASR-0.6B与MySQL存储系统集成import os import torch from qwen_asr import Qwen3ASRModel from datetime import datetime class QwenASRMySQLPipeline: def __init__(self, db_config, model_size0.6B): self.db_manager ASRDataManager(**db_config) self.model self.load_model(model_size) def load_model(self, model_size): 加载语音识别模型 model_name fQwen/Qwen3-ASR-{model_size} print(f正在加载模型: {model_name}) try: model Qwen3ASRModel.from_pretrained( model_name, torch_dtypetorch.float16, device_mapauto ) print(模型加载成功) return model except Exception as e: print(f模型加载失败: {e}) return None def process_audio_directory(self, audio_dir, batch_size10): 处理目录中的音频文件 if not self.model: print(模型未加载无法处理音频) return audio_files [f for f in os.listdir(audio_dir) if f.endswith((.wav, .mp3, .flac))] results [] for i, audio_file in enumerate(audio_files): audio_path os.path.join(audio_dir, audio_file) try: # 使用模型进行语音识别 start_time datetime.now() transcription self.model.transcribe(audio_path) processing_time (datetime.now() - start_time).total_seconds() # 提取结果 if transcription: result transcription[0] audio_id f{os.path.splitext(audio_file)[0]}_{int(datetime.now().timestamp())} results.append(( audio_id, audio_path, result.get(duration, 0), result.get(language, unknown), result.text, result.get(confidence, 0.0), processing_time )) # 批量插入 if len(results) batch_size or i len(audio_files) - 1: if self.db_manager.batch_insert_results(results): print(f已处理 {i1}/{len(audio_files)} 个文件) results [] except Exception as e: print(f处理文件 {audio_file} 时出错: {e}) continue def run_continuous_processing(self, watch_dir, check_interval60): 持续监控目录并处理新文件 import time processed_files set() while True: current_files set(os.listdir(watch_dir)) new_files current_files - processed_files if new_files: print(f发现 {len(new_files)} 个新文件开始处理...) self.process_audio_directory(watch_dir) processed_files current_files time.sleep(check_interval) # 配置和使用示例 if __name__ __main__: # 数据库配置 db_config { host: localhost, user: your_username, password: your_password, database: asr_data } # 创建处理管道 pipeline QwenASRMySQLPipeline(db_config, model_size0.6B) # 处理单个目录 pipeline.process_audio_directory(/path/to/audio/files) # 或者启动持续监控 # pipeline.run_continuous_processing(/path/to/watch/directory)6.2 自动化维护脚本创建一个定期维护的脚本确保数据库健康运行import schedule import time from datetime import datetime, timedelta def daily_maintenance(): 每日维护任务 print(f开始每日维护任务: {datetime.now()}) cleaner ASRDataCleaner(localhost, your_username, your_password, asr_data) # 清理低置信度数据 cleaner.clean_low_confidence_data(confidence_threshold0.6) # 创建新的月度表如果到了新月份 manage_monthly_tables() print(每日维护任务完成) def weekly_optimization(): 每周优化任务 print(f开始每周优化任务: {datetime.now()}) # 这里可以添加数据库优化命令如OPTIMIZE TABLE等 # 注意在生产环境中谨慎使用可能会锁表 print(每周优化任务完成) # 设置定时任务 schedule.every().day.at(02:00).do(daily_maintenance) # 每天凌晨2点执行 schedule.every().sunday.at(03:00).do(weekly_optimization) # 每周日凌晨3点执行 if __name__ __main__: print(启动自动化维护调度器...) while True: schedule.run_pending() time.sleep(60) # 每分钟检查一次7. 总结通过本文的教程我们构建了一个完整的Qwen3-ASR-0.6B语音数据存储解决方案。这个方案不仅解决了海量语音识别数据的存储问题还通过分表策略、索引优化和自动化流程设计确保了系统的高效性和可扩展性。实际使用下来这个方案部署简单基本上按照步骤来就能搭建起来。MySQL的分表策略确实能有效提升大数据量下的查询性能全文搜索功能也让语音内容的检索变得很方便。如果你需要处理语音识别数据建议先从小规模开始尝试熟悉了整个流程后再逐步扩展到生产环境。当然这个方案还有可以优化的地方比如可以考虑添加数据压缩功能来减少存储空间或者实现更复杂的数据分析功能。不过对于大多数应用场景来说现有的功能已经足够使用了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

Python调用大模型不再依赖云厂商:手把手实现TensorRT-LLM+FastAPI+HTTPS双向认证的零信任推理服务(含完整Dockerfile)

Python调用大模型不再依赖云厂商:手把手实现TensorRT-LLM+FastAPI+HTTPS双向认证的零信任推理服务(含完整Dockerfile)

第一章:Python大模型推理本地私有化部署在数据安全与合规性要求日益严格的背景下,将大语言模型(LLM)推理能力本地化、私有化部署已成为企业级AI应用的关键路径。Python凭借其丰富的生态支持(如Transformers、llama.cpp…

2026/5/17 9:50:26 阅读更多 →
未来之窗昭和仙君(八十一)智能监控门禁命令替换—东方仙盟练气

未来之窗昭和仙君(八十一)智能监控门禁命令替换—东方仙盟练气

核心代码完整代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>东方仙盟服务器日志分析工具<…

2026/5/17 9:50:24 阅读更多 →
如何通过事件驱动架构实现BewlyBewly高效组件通信

如何通过事件驱动架构实现BewlyBewly高效组件通信

如何通过事件驱动架构实现BewlyBewly高效组件通信 【免费下载链接】BewlyBewly Improve your Bilibili homepage by redesigning it, adding more features, and personalizing it to match your preferences. (English | 简体中文 | 正體中文 | 廣東話) 项目地址: https://g…

2026/5/17 9:50:25 阅读更多 →

最新新闻

LB200倒置显微镜在梅毒螺旋体体外培养观察中的解决方案

LB200倒置显微镜在梅毒螺旋体体外培养观察中的解决方案

LB200倒置显微镜在梅毒螺旋体体外培养观察中的解决方案 梅毒螺旋体体外培养&#xff1a;微观世界的艰难跋涉 梅毒螺旋体是一种难以在体外环境中生存和繁殖的特殊病原体。其体外培养面临着很高的技术挑战&#xff0c;需要精确模拟人体内的复杂环境。在这一过程中&#xff0c;对培…

2026/7/6 3:38:09 阅读更多 →
PCB布局3大常见误区解析:从BGA阴影效应到40mil间距的工程取舍

PCB布局3大常见误区解析:从BGA阴影效应到40mil间距的工程取舍

PCB布局3大常见误区解析&#xff1a;从BGA阴影效应到40mil间距的工程取舍在硬件工程师的日常工作中&#xff0c;PCB布局往往是最容易被低估却又最影响最终产品性能的环节。许多初学者在完成原理图设计后&#xff0c;常常迫不及待地将元器件"塞"进电路板&#xff0c;却…

2026/7/6 3:38:09 阅读更多 →
从信息检索到语义推荐:GEO的技术演进逻辑与越华云图陪跑方案

从信息检索到语义推荐:GEO的技术演进逻辑与越华云图陪跑方案

一、技术背景&#xff1a;搜索范式的迁移 信息获取方式正在经历第三次范式转移&#xff1a;阶段核心机制用户行为品牌优化目标Web 1.0&#xff08;门户时代&#xff09;编辑推荐被动浏览出现在门户网站Web 2.0&#xff08;搜索时代&#xff09;关键词检索主动搜索点击SEO排名优…

2026/7/6 3:36:07 阅读更多 →
LangChain Agent 开发第一天:先把最小 Demo 跑起来

LangChain Agent 开发第一天:先把最小 Demo 跑起来

今天先不讲复杂概念&#xff0c;也不急着做完整项目。 第一天的目标很简单&#xff1a;创建一个 LangChain Agent 项目&#xff0c;配置好模型接口&#xff0c;并跑通一个最基础的 Agent 示例。 只要这一步能跑通&#xff0c;后面再加工具、记忆、工作流、前端页面&#xff0…

2026/7/6 3:32:06 阅读更多 →
用《白鲸记》测试生产力应用:处理长文能力是关键?

用《白鲸记》测试生产力应用:处理长文能力是关键?

《白鲸记》&#xff1a;生产力应用的测试利器 待办事项列表应处理多少项内容虽非紧迫问题&#xff0c;但作者常思考生产力应用处理“用户生成”内容的能力。作者选择用《白鲸记》测试应用&#xff0c;因其篇幅长、用词复杂&#xff0c;若应用处理《白鲸记》表现良好&#xff0c…

2026/7/6 3:30:05 阅读更多 →
AI应用落地四板斧:场景闭环、数据可得、人机协同、交付确定

AI应用落地四板斧:场景闭环、数据可得、人机协同、交付确定

1. 项目概述&#xff1a;这不是发布会PPT&#xff0c;而是一份AI应用落地的实操路线图“腾讯智能体全景图亮相&#xff0c;汤道生解密打造AI应用四板斧”——这个标题乍看是科技媒体通稿的典型句式&#xff0c;但如果你在2023—2024年深度参与过至少两个中型以上AI项目落地&…

2026/7/6 3:30:05 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性&#xff1a;5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域&#xff0c;单元测试是保证代码质量的重要环节。当应用涉及数据库操作时&#xff0c;测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南&#xff1a;用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南&#xff1a;告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况&#xff1a;下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻