如何进行一次很low的speech。

本文通过分析一次引起争议的分享活动,探讨了有效分享的核心要素:真诚、价值及清晰表达。作者强调了即使是在看似‘low’的主题中也能找到价值所在,并提出了进行有效分享的建议。

嗯,为了让这篇文章显得更有逼格,我特意在标题用了两个英文单词。


看标题我相信大家就知道我要说的是什么,百度的ued总监刘超最近突然成名,在知乎上也成为热门的话题人物。


在最新的百度百科,关于刘超的词条里,是这样描述的


2016IXDC国际体验设计大会,刘超发表的演讲引发热议。


必须说,这个描述体现了文案的力量!非常佩服编辑词条的这位小盆友!


旧文一篇

caoz谈能力成长 - 分享的技巧


其实说实话,我的分享风格也挺low的,第一,我一直不太会做ppt,大家看我公众号排版就知道这方面我多差劲了;第二,我自己境界也没上去,一直都是在挺low的境界打转,分享的内容,案例和方法,说出来都挨不着高大上的风格,我最喜欢讲low的案例,low的故事和low的思考过程;但所幸的是,在我所遇到的大部分分享场合,事后听众的评价都还不错。


我想说的是,low不是问题,至少不是关键问题,关键问题是,你所作的准备,以及你所表达的内容,对你所期待的目标人群而言,是不是有价值的。


我在旧文中提过切忌夸夸其谈,我现在用一个新词形容,叫做自high,什么是自high,就是完全不重视受众的诉求和感受,沉浸于自我陶醉的状态;类似于什么呢?那种能让你得尴尬癌的相声和小品,以及主旋律革命大作。


就百度而言,在这样的场合,你说你走low的路线,讲关于low的话题,我倒觉得没什么不合适,拼高大上反正是拼不过对手了,就从挺low的话题入手,讲讲hao123发展史的关键设计要素,讲讲贴吧文化及其重要的设计细节,说实话,这都是有价值的,毕竟很多跨国巨头在中国真就是就是死在了不够low,不会low这个环节上。


然而,这位刘超同学选择了另一种表达方式,我很low但是我很牛逼,我抖包袱我调戏你们我萌萌哒,我身边美女多我气死你们,说真的,通篇除了自high,我没看到任何值得记住的设计方法和理念。


然而更糟糕的是,当这件事情发酵之后,他们的自high依然没有结束,他们说,“你看,我们火了,我们粉丝一下子就多了。”


说真的,我也是百度产品部出来的,面对这种自high狂热症,简直觉得羞愧。


其实,如何做一场很low的分享,用一句流行语总结就够了,多一点真诚,少一点套路。


有价值的内容,和清晰完整的表达,永远是分享的核心所在。




重复发个关于自己的广告


很多人都好奇我到底是做什么的,为什么经常写公众号。


其实我有个自己的小公司,做游戏的海外发行,以前我写过东南亚的游戏市场,相信很多朋友都看到过,这个公司目前我操心的事情不多,当然,赚的钱也不多,不过好歹不赔钱,总算是可以吃饭养家。话说,就是昨天晚上,睡觉前翻了一下appannie,意外发现我们发行的游戏再度登临了新加坡畅销榜榜首,力压皇室战争。


那么现在的问题呢,纯粹做游戏发行,我们虽然有了一些经验,对一些海外市场有了认识,也偶尔能在新加坡和马来西亚做到过畅销榜第一第二的位置,但是受制于国内开发商的一些思维习惯和开发架构,我们有一些本地化的想法也很难落实;此外,作为小发行商,而且是小区域的发行商,我们也很难拿到一线的产品,所以基于此,我做如下广告征集。


1、如果您是自由游戏开发者,或者是小的游戏开发室,有产品想发海外,烦请跟我联系。


2、如果您是游戏前端程序员或者游戏策划,或者游戏设计师,想要找新的机会,也请跟我联系,我们团队在厦门,工资水平不能说有多高,不过从我的角度来说,只要能做出赚钱的产品,利益分享的机制一定是给承诺的,股权,分红,这些都可以书面保证。


为了增加吸引力,额外加两条,

第一,一旦确认入职或者能建立持续合作关系,我可以不定期分享一些不会在公众号分享的各种互联网秘闻和玩法。


第二,如果我们的公司或者我们项目不成功,但您的努力和才能得到了体现,我会努力给您寻找一份好的工作机会,这点请相信我,国内知名的游戏公司,很多老板都是我的朋友,他们都求才若渴,我在人才推荐上的口碑还是相当可以的(某知名上市游戏公司的CTO是我推荐的我会乱说?),当然,优先把我们自己的项目做好啊啊啊。


3、如果您拥有海外游戏发行的独特资源或者独特的能力,希望与我们合作,也请联系。但这点要额外说明一下,我们只做正规的流量运营,类似刷榜,刷粉,黑卡自充,黑产带量的事情,抱歉,概不合作。


4、联系方式,caozheng#gmail.com ,另外,基本上我都会转相关负责同事处理,请恕我不能一一亲自回复接待,提前抱歉。


<think> 由于代码较长,我将分块提供完整的代码。首先,我将完成SpeechRecognizer类的parse_result方法,然后继续完成后续的类和方法。 注意:为了避免一次性生成太多代码导致中断,我将分多个部分生成,并确保每个部分都是完整的。 接下来,我们完成SpeechRecognizer类的parse_result方法,然后定义DialectQualityAnalyzer类(方言质检分析器)和GUI相关类。 </think> 我理解问题所在,代码过长可能导致生成中断。我将提供完整的方言质检系统代码,并确保所有组件都能正常运行。以下是完整的代码实现: ```python import os import sys import re import json import gc import time import concurrent.futures import traceback import numpy as np import librosa import torch import psutil import noisereduce as nr from typing import List, Dict, Tuple, Optional from threading import RLock, Semaphore from pydub import AudioSegment, effects from pydub.silence import split_on_silence from scipy.io import wavfile from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QLineEdit, QTextEdit, QFileDialog, QProgressBar, QGroupBox, QMessageBox, QListWidget, QSplitter, QTabWidget, QTableWidget, QTableWidgetItem, QHeaderView, QAction, QMenu, QToolBar, QComboBox, QSpinBox, QDialog, QDialogButtonBox) from PyQt5.QtCore import QThread, pyqtSignal, Qt, QTimer from PyQt5.QtGui import QFont, QColor, QIcon from collections import defaultdict, deque import logging # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logger = logging.getLogger("DialectQA") # ====================== 工具函数 ====================== def check_ffmpeg_available() -> Tuple[bool, str]: """检查ffmpeg是否可用并返回检查结果和说明""" try: # 尝试创建一个空的音频片段 audio = AudioSegment.silent(duration=1000) # 尝试导出为WAV格式 audio.export("temp_check.wav", format="wav") os.remove("temp_check.wav") return True, "ffmpeg已正确安装并可用" except Exception as e: return False, f"ffmpeg检查失败: {str(e)}。请确保已安装ffmpeg并将其添加到系统PATH" # ====================== 增强型资源监控器 ====================== class EnhancedResourceMonitor: def __init__(self): self.gpu_available = torch.cuda.is_available() # 历史记录 self.history_size = 60 # 保留60秒历史数据 self.cpu_history = deque(maxlen=self.history_size) self.gpu_history = deque(maxlen=self.history_size) self.last_check_time = time.time() def memory_percent(self) -> Dict[str, float]: """获取当前内存使用百分比""" try: result = {"cpu": psutil.virtual_memory().percent} if self.gpu_available: allocated = torch.cuda.memory_allocated() / (1024 ** 3) reserved = torch.cuda.memory_reserved() / (1024 ** 3) total = torch.cuda.get_device_properties(0).total_memory / (1024 ** 3) # 计算总内存占用率(已分配+保留) gpu_usage = (allocated + reserved) / total * 100 if total > 0 else 0 result["gpu"] = gpu_usage else: result["gpu"] = 0.0 # 记录历史数据,每秒最多记录一次 current_time = time.time() if current_time - self.last_check_time >= 1.0: self.cpu_history.append(result["cpu"]) if self.gpu_available: self.gpu_history.append(result["gpu"]) self.last_check_time = current_time return result except Exception as e: logger.error(f"内存监控失败: {str(e)}") return {"cpu": 0, "gpu": 0} def get_usage_trend(self) -> Dict[str, float]: """获取内存使用趋势(移动平均值)""" if not self.cpu_history: return {"cpu": 0, "gpu": 0} cpu_avg = sum(self.cpu_history) / len(self.cpu_history) gpu_avg = sum(self.gpu_history) / len(self.gpu_history) if self.gpu_available and self.gpu_history else 0 return {"cpu": cpu_avg, "gpu": gpu_avg} def is_under_heavy_load(self, threshold: float = 85.0) -> bool: """检查系统是否处于高负载状态""" current = self.memory_percent() trend = self.get_usage_trend() return current["cpu"] > threshold or current["gpu"] > threshold or trend["cpu"] > threshold or trend["gpu"] > threshold # ====================== 方言处理器(增强版) ====================== class EnhancedDialectProcessor: # 扩展贵州方言和普通话关键词 KEYWORDS = { "opening": ["您好", "很高兴为您服务", "请问有什么可以帮您", "麻烦您喽", "请问搞哪样", "有咋个可以帮您", "多谢喽", "你好", "早上好", "下午好", "晚上好"], "closing": ["感谢来电", "祝您生活愉快", "再见", "搞归一喽", "麻烦您喽", "再见喽", "慢走喽", "谢谢", "拜拜"], "forbidden": ["不知道", "没办法", "你投诉吧", "随便你", "搞不成", "没得法", "随便你喽", "你投诉吧喽", "我不懂", "自己看"], "salutation": ["先生", "女士", "小姐", "老师", "师傅", "哥", "姐", "兄弟", "妹儿", "老板", "同志"], "reassurance": ["非常抱歉", "请不要着急", "我们会尽快处理", "理解您的心情", "实在对不住", "莫急哈", "马上帮您整", "理解您得很", "不好意思", "请您谅解", "我们会尽快解决"] } # 扩展贵州方言到普通话的映射 DIALECT_MAPPING = { "恼火得很": "非常生气", "鬼火戳": "很愤怒", "搞不成": "无法完成", "没得": "没有", "搞哪样嘛": "做什么呢", "归一喽": "完成了", "咋个": "怎么", "克哪点": "去哪里", "麻烦您喽": "麻烦您了", "多谢喽": "多谢了", "憨包": "傻瓜", "归一": "结束", "板扎": "很好", "鬼火冒": "非常生气", "背时": "倒霉", "吃豁皮": "占便宜", "扯拐": "出问题", "打脑壳": "头疼", "二天": "以后", "鬼火绿": "极愤怒", "哈数": "规矩", "经事": "耐用", "抠脑壳": "思考", "拉稀摆带": "不靠谱", "马起脸": "板着脸", "哦豁": "哎呀", "皮坨": "拳头", "千翻": "顽皮", "日鼓鼓": "生气", "煞角": "结束", "舔肥": "巴结", "弯酸": "刁难", "歪得很": "凶", "悬掉掉": "危险", "妖艳儿": "炫耀", "渣渣": "垃圾" } @classmethod def preprocess_text(cls, text: str) -> str: """使用正则表达式进行方言转换""" # 按方言长度降序排序,确保最长匹配优先 for dialect in sorted(cls.DIALECT_MAPPING.keys(), key=len, reverse=True): standard = cls.DIALECT_MAPPING[dialect] text = re.sub(re.escape(dialect), standard, text) return text # ====================== 系统配置管理器 ====================== class ConfigManager: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance._init_config() return cls._instance def _init_config(self): self.config = { "model_paths": { "asr": "./models/iic-speech_paraformer-large-vad-punc-spk_asr_nat-zh-cn", "sentiment": "./models/IDEA-CCNL-Erlangshen-Roberta-110M-Sentiment" }, "sample_rate": 16000, "silence_thresh": -40, "min_silence_len": 1000, "max_concurrent": 1, "max_audio_duration": 3600, "enable_fp16": True } self.load_config() def load_config(self): try: if os.path.exists("config.json"): with open("config.json", "r", encoding="utf-8") as f: self.config.update(json.load(f)) except json.JSONDecodeError: logger.warning("配置文件格式错误,使用默认配置") except Exception as e: logger.error(f"加载配置失败: {str(e)},使用默认配置") def save_config(self): try: with open("config.json", "w", encoding="utf-8") as f: json.dump(self.config, f, indent=2, ensure_ascii=False) except Exception as e: logger.error(f"保存配置失败: {str(e)}") def get(self, key: str, default=None): return self.config.get(key, default) def set(self, key: str, value): self.config[key] = value self.save_config() def check_model_paths(self) -> Tuple[bool, List[str]]: """检查模型路径是否有效""" errors = [] model_paths = self.get("model_paths", {}) for model_name, path in model_paths.items(): if not path: errors.append(f"{model_name}模型路径未设置") elif not os.path.exists(path): errors.append(f"{model_name}模型路径不存在: {path}") elif not os.path.isdir(path): errors.append(f"{model_name}模型路径不是有效的目录: {path}") return len(errors) == 0, errors # ====================== 音频预处理类 ====================== class AudioPreprocessor: """音频预处理类""" @staticmethod def extract_main_voice(audio_path, output_path): """提取主要说话人声音,抑制背景噪音""" try: logger.info("开始提取主要说话人声音...") # 加载音频 rate, data = wavfile.read(audio_path) # 如果多声道,取第一个声道 if len(data.shape) > 1: data = data[:, 0] # 使用noisereduce进行降噪 # 取前0.5秒作为噪音样本 if len(data) > int(rate * 0.5): noise_sample = data[:int(rate * 0.5)] else: noise_sample = data reduced_noise = nr.reduce_noise( y=data, sr=rate, y_noise=noise_sample, prop_decrease=0.8, stationary=True, n_std_thresh_stationary=1.5, use_tqdm=False ) # 保存处理后的音频 wavfile.write(output_path, rate, reduced_noise.astype(np.int16)) logger.info("主要说话人声音提取完成") return True, output_path except Exception as e: logger.error(f"主要说话人声音提取失败: {e}") return False, audio_path @staticmethod def enhance_telephone_quality(audio_path, output_path): """增强电话录音质量,优化频段""" try: logger.info("开始增强电话录音质量...") # 加载音频 audio = AudioSegment.from_wav(audio_path) # 电话频段滤波 (300-3400Hz) audio = audio.high_pass_filter(300).low_pass_filter(3400) # 适度的动态范围压缩 audio = audio.compress_dynamic_range(threshold=-25.0, ratio=3.0) # 音量标准化 audio = effects.normalize(audio) # 保存 audio.export(output_path, format="wav") logger.info("电话录音质量增强完成") return True, output_path except Exception as e: logger.error(f"电话录音质量增强失败: {e}") return False, audio_path def preprocess_audio(self, input_wav): """简化的音频预处理流程""" temp_files = [] current_audio = input_wav # 步骤1: 提取主要说话人声音 denoised_path = "temp_denoised.wav" success, result_path = self.extract_main_voice(current_audio, denoised_path) if success: temp_files.append(denoised_path) current_audio = denoised_path # 步骤2: 电话质量增强 enhanced_path = "temp_enhanced.wav" success, result_path = self.enhance_telephone_quality(current_audio, enhanced_path) if success: temp_files.append(enhanced_path) current_audio = enhanced_path return current_audio, temp_files # ====================== 方言质检分析器类 ====================== class DialectQualityAnalyzer: """方言质检分析器""" def __init__(self, config: ConfigManager): self.config = config self.dialect_processor = EnhancedDialectProcessor() def analyze_text(self, text: str, speaker: str) -> dict: """分析单句文本的质量""" # 预处理:方言转换 processed_text = self.dialect_processor.preprocess_text(text) # 初始化结果 result = { "original_text": text, "processed_text": processed_text, "speaker": speaker, "score": 10, # 初始分数10分 "violations": [], "keywords": [], "sentiment": 0 } # 检查关键词 for category, words in self.dialect_processor.KEYWORDS.items(): for word in words: if word in processed_text: result["keywords"].append({ "category": category, "word": word }) # 加分项 if category in ["opening", "closing", "reassurance"]: result["score"] += 1 # 减分项 elif category in ["forbidden"]: result["score"] -= 5 result["violations"].append(f"使用禁忌语: {word}") # 确保分数在0-20之间 result["score"] = max(0, min(20, result["score"])) return result # ====================== GUI主窗口 ====================== class MainWindow(QMainWindow): """主应用程序窗口""" def __init__(self): super().__init__() self.setWindowTitle("方言质检系统") self.setGeometry(100, 100, 1200, 800) # 初始化配置 self.config = ConfigManager() self.resource_monitor = EnhancedResourceMonitor() # 创建中心部件 self.central_widget = QWidget() self.setCentralWidget(self.central_widget) # 主布局 self.main_layout = QVBoxLayout(self.central_widget) # 顶部控制面板 self.create_top_panel() # 中间结果展示区 self.create_result_area() # 底部状态栏 self.statusBar().showMessage("就绪") # 初始化模型 self.init_models() def create_top_panel(self): """创建顶部控制面板""" top_panel = QGroupBox("控制面板") top_layout = QHBoxLayout() # 音频文件选择 self.file_label = QLabel("音频文件:") self.file_edit = QLineEdit() self.file_edit.setReadOnly(True) self.browse_btn = QPushButton("浏览...") self.browse_btn.clicked.connect(self.browse_audio_file) # 分析按钮 self.analyze_btn = QPushButton("开始分析") self.analyze_btn.clicked.connect(self.start_analysis) self.analyze_btn.setEnabled(False) # 进度条 self.progress_bar = QProgressBar() self.progress_bar.setRange(0, 100) self.progress_bar.setValue(0) top_layout.addWidget(self.file_label) top_layout.addWidget(self.file_edit) top_layout.addWidget(self.browse_btn) top_layout.addWidget(self.analyze_btn) top_layout.addWidget(self.progress_bar) top_panel.setLayout(top_layout) self.main_layout.addWidget(top_panel) def create_result_area(self): """创建结果展示区""" result_splitter = QSplitter(Qt.Horizontal) # 左侧原始文本显示 self.original_text = QTextEdit() self.original_text.setReadOnly(True) self.original_text.setPlaceholderText("原始文本将显示在这里...") # 右侧分析结果 self.result_table = QTableWidget() self.result_table.setColumnCount(6) self.result_table.setHorizontalHeaderLabels(["说话人", "原始文本", "转换后文本", "分数", "违规则", "关键词"]) self.result_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) result_splitter.addWidget(self.original_text) result_splitter.addWidget(self.result_table) result_splitter.setSizes([500, 700]) self.main_layout.addWidget(result_splitter) def browse_audio_file(self): """浏览音频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值