当前位置: 首页 > news >正文

【C/C++】Windows SAPI自实现文字转语音

本文通过封装Windows SAPI(Speech Application Programming Interface),提供了一个现代化的C++接口实现文字转语音功能。主要特性包括支持同步/异步语音合成、可调节语速(-10到10)和音量控制(0-100%),同时支持将合成语音保存为WAV文件,并自动处理特殊字符转义,设计上也确保了线程安全。该接口依赖于Windows系统(需.NET Framework支持)、PowerShell 5.1及以上版本,以及C++11或更高版本。完整代码在文字末尾提供。

快速开始

基础使用示例

#include "tts.hpp"int main() {TTS::TextToSpeech tts;// 设置语音参数tts.set_rate(5);    // 加快语速tts.set_volume(80); // 80%音量// 同步朗读tts.speak_sync("Hello, welcome to the text-to-speech system.");// 异步朗读auto future = tts.speak_async("This is an async operation.");future.wait(); // 等待完成// 保存到文件std::string filename = tts.save_to_wav("Audio saved to file.");return 0;
}

核心功能详解

语音参数设置

语速控制 (set_rate())

void set_rate(int rate);  // 范围:-10 ~ 10
  • 正值加快语速
  • 负值减慢语速
  • 自动钳制在有效范围内

音量控制 (set_volume())

void set_volume(int volume);  // 范围:0 ~ 100
  • 0表示静音
  • 100表示最大音量
  • 支持百分比精确控制

同步朗读 (speak_sync())

bool speak_sync(const std::string& text);
  • 阻塞当前线程直到朗读完成
  • 返回执行状态(true表示成功)
  • 适合需要顺序执行的场景

示例:

if (!tts.speak_sync("Critical system alert!")) {// 错误处理
}

异步朗读 (speak_async())

std::future<bool> speak_async(const std::string& text);
  • 立即返回std::future对象

  • 支持多种等待方式:

    auto future = tts.speak_async("Processing completed");// 方式1:阻塞等待
    future.wait();// 方式2:轮询检查
    while (future.wait_for(100ms) != std::future_status::ready) {// 执行其他任务
    }// 获取结果
    bool success = future.get();
    

保存音频文件 (save_to_wav())

std::string save_to_wav(const std::string& text, const std::string& filename = "");
  • 自动生成临时文件(当filename为空时)
  • 返回最终文件路径
  • 文件保存位置规则:
    • 指定filename:使用完整路径
    • 未指定:生成随机文件名(系统临时目录)

示例:

// 自动生成临时文件
auto auto_file = tts.save_to_wav("Automatic filename");// 自定义路径
std::string custom_path = R"(C:\audio\alert.wav)";
auto custom_file = tts.save_to_wav("Custom path", custom_path);

高级用法

批量语音生成

std::vector<std::future<bool>> batch_process() {TTS::TextToSpeech tts;std::vector<std::future<bool>> results;for (int i = 0; i < 10; ++i) {std::string text = "Message " + std::to_string(i);results.push_back(tts.speak_async(text));}return results;
}

实时进度跟踪

void monitor_async() {auto future = tts.speak_async("Long running operation");std::thread monitor([&future]{while (future.wait_for(1s) != std::future_status::ready) {std::cout << "Synthesizing..." << std::endl;}std::cout << "Completed with status: " << future.get() << std::endl;});monitor.detach();
}

注意事项与最佳实践

字符处理

  • 自动转义XML特殊字符:&, <, >, ", '

  • 支持多语言文本(需系统语音包支持)

  • 建议预处理用户输入:

    std::string sanitize_input(const std::string& raw) {// 移除控制字符等std::string filtered;std::copy_if(raw.begin(), raw.end(), std::back_inserter(filtered),[](char c){ return std::isprint(c); });return filtered;
    }
    

性能优化

  • 复用TextToSpeech实例(避免重复初始化)

  • 异步操作时注意生命周期管理:

    // 错误示例(对象提前销毁):
    auto future = TTS::TextToSpeech().speak_async("text");// 正确做法:
    auto tts = std::make_shared<TTS::TextToSpeech>();
    auto future = tts->speak_async("text");
    

错误处理

  • 检查返回值:

    if (!tts.speak_sync("text")) {std::cerr << "Speech synthesis failed" << std::endl;
    }
    
  • 常见错误原因:

    • PowerShell访问权限不足
    • 无效的文件路径
    • 系统语音引擎故障

常见问题解答

Q:支持哪些音频格式?
A:目前仅支持WAV格式,由系统API决定

Q:如何处理中文字符?
A:需确保:

  1. 系统已安装中文语音包
  2. 代码文件使用UTF-8编码
  3. 控制台支持Unicode(建议使用chcp 65001)

Q:为什么需要生成批处理文件?
A:为了解决:

  • PowerShell直接执行的编码问题
  • 长命令行参数限制
  • 错误代码捕获需求

Q:最大支持文本长度?
A:由系统限制决定,建议分段处理超过1MB的文本

Q:如何实现语音中断?
A:当前版本未实现,但可以通过销毁对象终止异步操作

TTS.hpp 源代码

#pragma once
#include <string>
#include <sstream>
#include <cstdlib>
#include <random>
#include <atomic>
#include <thread>
#include <memory>
#include <system_error>
#include <future>
#include <fstream>
#include <cstdio>#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#endifnamespace TTS {class TextToSpeech {
public:static constexpr int MIN_RATE = -10;static constexpr int MAX_RATE = 10;static constexpr int MIN_VOLUME = 0;static constexpr int MAX_VOLUME = 100;explicit TextToSpeech() = default;// 设置语音速率(-10~10)void set_rate(int rate) {rate_ = clamp(rate, MIN_RATE, MAX_RATE);}// 设置音量(0~100)void set_volume(int volume) {volume_ = clamp(volume, MIN_VOLUME, MAX_VOLUME);}// 同步朗读(阻塞直到完成)bool speak_sync(const std::string& text) {return execute_command(generate_ps_command(text));}// 异步朗读(立即返回)std::future<bool> speak_async(const std::string& text) {return std::async(std::launch::async, [this, text] { return this->speak_sync(text); });}// 生成临时WAV文件(返回文件路径)std::string save_to_wav(const std::string& text, const std::string& filename = "") {std::string full_path;bool clean_up;std::tie(full_path, clean_up) = generate_temp_path(filename, ".wav");std::string command = generate_ps_command(text, full_path);if (!execute_command(command)) {if (clean_up) std::remove(full_path.c_str());return "";}return full_path;}private:int rate_ = 0; // 默认语速int volume_ = 100; // 默认音量std::atomic<bool> cancel_flag_{false};// 生成PowerShell命令std::string generate_ps_command(const std::string& text, const std::string& output_file = "") const {std::ostringstream oss;oss << "powershell -Command \"";oss << "Add-Type -AssemblyName System.Speech; ";oss << "$speech = New-Object System.Speech.Synthesis.SpeechSynthesizer; ";oss << "$speech.Rate = " << rate_ << "; ";oss << "$speech.Volume = " << volume_ << "; ";if (!output_file.empty()) {oss << "$speech.SetOutputToWaveFile('" << output_file << "'); ";} else {oss << "$speech.SetOutputToDefaultAudioDevice(); ";}oss << "$speech.Speak([System.Xml.XmlConvert]::VerifyXmlChars('"<< escape_ps_string(escape_xml(text)) << "'));\"";return oss.str();}// 转义 PowerShell 字符串std::string escape_ps_string(const std::string& text) const {std::string result;result.reserve(text.size() * 2);for (char c : text) {result += (c == '\'') ? "''" : std::string(1, c);}return result;}// 执行命令并返回结果bool execute_command(const std::string& command) const {// 创建并写入批处理文件std::string bat_path;bool dummy;std::tie(bat_path, dummy) = generate_temp_path("tts_", ".bat");std::ofstream bat_file(bat_path);if (!bat_file) return false;bat_file << "@echo off\n"<< "chcp 65001 > nul\n"<< command << "\n"<< "exit /b %ERRORLEVEL%";bat_file.close();// 执行批处理文件std::string cmd = "cmd /c \"" + bat_path + "\"";int result = std::system(cmd.c_str());// 清理临时文件std::remove(bat_path.c_str());return (result == 0);}// 生成临时文件路径std::tuple<std::string, bool> generate_temp_path(const std::string& prefix = "tts_", const std::string& extension = "") const {static std::random_device rd;static std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 15);std::string full_path;bool need_cleanup = false;if (prefix.empty()) {char tmp_name[L_tmpnam];if (std::tmpnam(tmp_name)) {full_path = tmp_name;need_cleanup = true;}} else {const std::string temp_dir = get_temp_directory();do {std::string unique_part;for (int i = 0; i < 8; ++i) {unique_part += "0123456789abcdef"[dis(gen) % 16];}full_path = temp_dir + "\\" + prefix + unique_part + extension;} while (file_exists(full_path));}return {full_path, need_cleanup};}// XML 转义static std::string escape_xml(std::string data) {std::string buffer;buffer.reserve(data.size());for (char c : data) {switch (c) {case '&':  buffer += "&amp;";  break;case '\"': buffer += "&quot;"; break;case '\'': buffer += "&apos;"; break;case '<':  buffer += "&lt;";   break;case '>':  buffer += "&gt;";   break;default:   buffer += c;        break;}}return buffer;}// 范围限制函数template <typename T>static T clamp(T value, T min, T max) {return (value < min) ? min : (value > max) ? max : value;}// 获取临时目录static std::string get_temp_directory() {const char* tmp = std::getenv("TEMP");if (!tmp) tmp = std::getenv("TMP");return tmp ? tmp : ".";}// 检查文件是否存在static bool file_exists(const std::string& path) {
#ifdef _WIN32return ::_access(path.c_str(), 0) == 0;
#elsereturn ::access(path.c_str(), F_OK) == 0;
#endif}
};} // namespace TTS

相关文章:

【C/C++】Windows SAPI自实现文字转语音

本文通过封装Windows SAPI&#xff08;Speech Application Programming Interface&#xff09;&#xff0c;提供了一个现代化的C接口实现文字转语音功能。主要特性包括支持同步/异步语音合成、可调节语速&#xff08;-10到10&#xff09;和音量控制&#xff08;0-100%&#xff…...

openmv的端口被拆分为两个 导致电脑无法访问openmv文件系统解决办法 openmv USB功能改动 openmv驱动被更改如何修复

我之前误打误撞遇到一次&#xff0c;直接把openmv的全部端口删除卸载然后重新插上就会自动重新装上一个openmv端口修复成功&#xff0c;大家可以先试试不行再用下面的方法 全部卸载再重新插拔openmv 要解决OpenMV IDE中出现的两个端口问题&#xff0c;可以尝试以下步骤&#x…...

8.攻防世界Web_php_wrong_nginx_config

进入题目页面如下 尝试弱口令密码登录 一直显示网站建设中&#xff0c;尝试无果&#xff0c;查看源码也没有什么特别漏洞存在 用Kali中的dirsearch扫描根目录试试 命令&#xff1a; dirsearch -u http://61.147.171.105:53736/ -e* 登录文件便是刚才登录的界面打开robots.txt…...

音叉模态分析

目录 0 序言 1 自由状态下模态求解 1.1 添加模态项目 1.2 生成网格 1.3 设置最大模态阶数 1.4 求解 1.5 结果查看 1.6 结果分析 2 音叉能否释放频率440Hz的音调 3 预应力模态求解 3.1 静态结构分析 3.1.1 添加静态结构项目 3.1.2生成网格 3.1.3添加边界条件 3.1…...

智慧园区系统集成解决方案引领未来城市管理的智能化转型

内容概要 在现代城市管理的背景下&#xff0c;“智慧园区系统集成解决方案”正扮演着越来越重要的角色。这种解决方案不仅仅是技术上的创新&#xff0c;更是一种全新的管理理念&#xff0c;它旨在通过高效的数据整合与分析&#xff0c;优化资源配置&#xff0c;提升运营效率。…...

(即插即用模块-特征处理部分) 二十、(TPAMI 2022) Permute-MLP 置换MLP模块

文章目录 1、Permute-MLP layer2、代码实现 paper&#xff1a;Vision Permutator: A Permutable MLP-Like Architecture for Visual Recognition Code&#xff1a;https://github.com/Andrew-Qibin/VisionPermutator 1、Permute-MLP layer 传统的 MLP-like 模型&#xff08;如…...

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后&#xff0c;目录下有三个文件夹&#xff1a; include 头文件lib 编译的二进制库&#xff0c;根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库&#xff0c;需要在配置属性->C/C->预…...

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…...

1.4 Go 数组

一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中&#xff0c;数组的长度是类型的一部分&#xff0c;因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定&#xff0c;且不可更改。 简单来说&#xff0c;数组…...

爬虫基础(三)Session和Cookie讲解

目录 一、前备知识点 &#xff08;1&#xff09;静态网页 &#xff08;2&#xff09;动态网页 &#xff08;3&#xff09;无状态HTTP 二、Session和Cookie 三、Session 四、Cookie &#xff08;1&#xff09;维持过程 &#xff08;2&#xff09;结构 正式开始说 Sessi…...

hive:基本数据类型,关于表和列语法

基本数据类型 Hive 的数据类型分为基本数据类型和复杂数据类型 加粗的是常用数据类型 BOOLEAN出现ture和false外的其他值会变成NULL值 没有number,decimal类似number 如果输入的数据不符合数据类型, 映射时会变成NULL, 但是数据本身并没有被修改 创建表 创建表的本质其实就是在…...

Maya软件安装步骤与百度网盘链接

软件简介&#xff1a; MAYA软件是Autodesk旗下的著名三维建模和动画软件。maya软件功能更为强大&#xff0c;体系更为完善&#xff0c;因此国内很多的三维动画制作人员都开始转向maya&#xff0c;maya软件已成为三维动画软件的主流。 百度网盘链接: https://pan.baidu.com/s…...

error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054

Descriptions&#xff1a; Solutions&#xff1a;...

PID算法的数学实现和参数确定方法

目录 概述 1 算法描述 1.1 PID算法模型 1.2 PID离散化的图形描述 1.3 PID算法的特点 2 离散化的PID算法 2.1 位置式PID算法 2.2 增量式PID算法 2.3 位置式PID与增量式PID比较 3 控制器参数整定 3.1 PID参数确定方法 3.1.1 凑试法 3.1.2 临界比例法 3.1.3 经验法…...

【已解决】ECharts 没有在页面生效

元素高度问题&#xff1a; ECharts 需要一个具有明确高度的容器来渲染图表&#xff0c;也就是说 echartsRef 元素需要一个明确的 div 高度。我项目中的问题就是在 .base-echarts&#xff08;我项目中的最外层元素&#xff09; 上设置了高度为 300px&#xff0c;但没有为 .echar…...

三角函数正交性应用--以信号分离为例

三角函数的正交性的应用 引言 在信号处理、通信等众多领域中&#xff0c;三角函数的正交性发挥着至关重要的作用。它不仅是理论分析的基础&#xff0c;更是实际应用中解决各种问题的有力工具。本文将详细介绍三角函数正交性的定义、证明&#xff0c;并通过一个具体的信号处理…...

ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…...

一个数如果恰好等于他的因子之和,这是就成为“完数“,例如6=1+2+3.编程找出1000以内的所有完数

from sys import stdoutfor i in range(2,1001):k[] #用于存储因子si #初始化s为当前数字ifor j in range(1,i):if i%j0: #如果j是i的因子s-j #从s中减去银子jk.append(j) #将因子j加入列表kif s0:#如果s最终为0,说明i是一个完数print(i)for j in range(len(k)): #遍历银子列表…...

理解 InnoDB 如何处理崩溃恢复

在数据库领域&#xff0c;数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心&#xff0c;其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面&#xff0c;我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。 一、写入流程 修改页面&…...

Linux-CentOS的yum源

1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源&#xff0c;163源&#xff0c;sohu源&#xff0c;知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...

Redis复制

一、Redis复制&#xff1a; 1.为了解决分布式中单点故障问题&#xff0c;通常会把数据复制多个副本部署到其他机器上来解决故障恢复和负载均衡等需求。 2.建立复制 参与复制的redis实例划分为主节点&#xff08;master&#xff09;和从节点&#xff08;slave&#xff09;,每个从…...

小白怎样部署和使用本地大模型DeepSeek ?

1 安装Ollama &#xff08;1&#xff09; 下载Ollama 从https://ollama.com/download 下载, 根据你的系统下载对应的版本&#xff0c;支持Win, Mac ,Linux&#xff1a; 如果下载不了&#xff0c;右键复制链接地址&#xff0c;贴到迅雷&#xff0c;指定可以下载下来。 (2) 安…...

ECharts 样式设置

ECharts 样式设置 引言 ECharts 是一款功能强大的可视化库&#xff0c;广泛用于数据可视化。样式设置是 ECharts 中的重要一环&#xff0c;它能够帮助开发者根据需求调整图表的视觉效果&#xff0c;使其更加美观和易于理解。本文将详细介绍 ECharts 的样式设置&#xff0c;包…...

Java synchronized关键字和锁分类

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 关于synchronized已经有很多博主很细致的讲解了&#xff0c;本文主要是通过代码例子再次理解下&#xff0c;并要求能头脑反射出相关知识点主要是锁分类的知识…...

Vue.js 新的生命周期钩子:`onMounted`, `onUpdated` 等

Vue.js 新的生命周期钩子&#xff1a;onMounted, onUpdated 等 今天我们来聊聊 Vue 3 中的生命周期钩子&#xff0c;特别是 onMounted、onUpdated 等。如果你对如何在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中使用这些钩子感到困惑&#xff0c;那么这篇文…...

OpenCV:闭运算

目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;开运算-CSDN博客 1. 简述…...

Android 音视频编解码 -- MediaCodec

引言 如果我们只是简单玩一下音频、视频播放&#xff0c;那么使用 MediaPlayer SurfaceView 播放就可以了&#xff0c;但如果想加个水印&#xff0c;加点其他特效什么的&#xff0c;那就不行了&#xff1b; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 Med…...

移动互联网用户行为习惯哪些变化,对小程序的发展有哪些积极影响

一、碎片化时间利用增加 随着生活节奏的加快&#xff0c;移动互联网用户的碎片化时间越来越多。在等公交、排队、乘坐地铁等间隙&#xff0c;用户更倾向于使用便捷、快速启动的应用来满足即时需求。小程序正好满足了这一需求&#xff0c;无需下载安装&#xff0c;随时可用&…...

数据分析系列--②RapidMiner导入数据和存储过程

一、下载数据 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从本地选择.csv或.xlsx 三、界面说明 四、存储过程 1.保存 Congratulations, you are done. 一、下载数据 点击下载AssociationAnalysisData.xlsx数据集 二、导入数据 1. 在本地计算机中创建3个文件夹 2. 从…...

Prometheus 中的 Exporter

在 Prometheus 生态系统中,Exporter 扮演着至关重要的角色,它们负责从不同的服务或系统中收集和暴露度量数据。本文将详细介绍 Exporter 的概念、类型以及如何有效使用它们将 Prometheus 集成到各种系统中进行监控。 什么是 Exporter? Exporter 是一段软件,它从应用程序或…...

从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能

一、前言 在最近使用Apipost时&#xff0c;突然注意到了http/1.1和http/2&#xff0c;如下图&#xff1a; 在我根深蒂固的记忆中&#xff0c;对于http的理解还停留在TCP协议、三次握手。由于我的好奇心&#xff0c;于是触发了我被动“开卷”&#xff0c;所以有了这篇文章&…...

GenAI 在金融服务领域的应用:2025 年的重点是什么

作者&#xff1a;来自 Elastic Karen Mcdermott GenAI 不是魔法 我最近参加了 ElasticON&#xff0c;我们与纽约 Elastic 社区一起度过了一天&#xff0c;讨论了使用检索增强生成 (retrieval augmented generation - RAG) 为大型语言模型 (large language models - LLMs) 提供…...

小红书文案生成器(基于openai API和streamlit)

prompt_text.py&#xff1a; # 专门用来放提示文本&#xff08;系统提示、用户提示&#xff09;system_prompt_text """ 你是小红书爆款写作专家&#xff0c;请你遵循以下步骤进行创作&#xff1a;首先产出5个标题&#xff08;包含适当的emoji表情&#xff09…...

Spring AOP 入门教程:基础概念与实现

目录 第一章&#xff1a;AOP概念的引入 第二章&#xff1a;AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章&#xff1a;Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…...

力扣面试150 快乐数 循环链表找环 链表抽象 哈希

Problem: 202. 快乐数 &#x1f469;‍&#x1f3eb; 参考题解 Code public class Solution {public int squareSum(int n) {int sum 0;while(n > 0){int digit n % 10;sum digit * digit;n / 10;}return sum;}public boolean isHappy(int n) {int slow n, fast squa…...

【实战篇章】深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据

文章目录 深入探讨&#xff1a;服务器如何响应前端请求及后端如何查看前端提交的数据一、服务器如何响应前端请求HTTP 请求生命周期全解析1.前端发起 HTTP 请求&#xff08;关键细节强化版&#xff09;2. 服务器接收请求&#xff08;深度优化版&#xff09; 二、后端如何查看前…...

《AI大模型开发笔记》DeepSeek技术创新点

一、DeepSeek横空出世 DeepSeek V3 以颠覆性技术架构创新强势破局&#xff01;革命性的上下文处理机制实现长文本推理成本断崖式下降&#xff0c;综合算力需求锐减90%&#xff0c;开启高效 AI 新纪元&#xff01; 最新开源的 DeepSeek V3模型不仅以顶尖基准测试成绩比肩业界 …...

【大模型LLM面试合集】大语言模型架构_MHA_MQA_GQA

MHA_MQA_GQA 1.总结 在 MHA&#xff08;Multi Head Attention&#xff09; 中&#xff0c;每个头有自己单独的 key-value 对&#xff1b;标准的多头注意力机制&#xff0c;h个Query、Key 和 Value 矩阵。在 MQA&#xff08;Multi Query Attention&#xff09; 中只会有一组 k…...

实战技巧:如何快速增加网站的收录页面?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/43.html 要快速增加网站的收录页面&#xff0c;可以从以下几个方面进行实战优化&#xff1a; 一、内容优化 高质量原创内容 确保网站内容具备高质量与原创性&#xff0c;满足搜索引擎对独…...

20-30 五子棋游戏

20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第21集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https:…...

PYH与MAC的桥梁MII/MIIM

在学习车载互联网时&#xff0c;看到了一句话&#xff0c;Processor通过DMA直接存储访问与MAC之间进行数据的交互&#xff0c;MAC通过MII介质无关接口与PHY之间进行数据的交互。常见的以太网硬件结构是&#xff0c;将MAC集成进Processor芯片&#xff0c;将PHY留在Processor片外…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)

以下是一个完整的词嵌入&#xff08;Word Embedding&#xff09;示例代码&#xff0c;使用 modelscope 下载 tiansz/bert-base-chinese 模型&#xff0c;并通过 transformers 加载模型&#xff0c;获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...

探秘 TCP TLP:从背景到实现

回家的路上还讨论了个关于 TCP TLP 的问题&#xff0c;闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。 TLP&#xff0c;先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO&#xf…...

MCU内部ADC模块误差如何校准

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、ADC误差校准引言 MCU 片内 ADC 模块的误差总包括了 5 个静态参数 (静态失调&#xff0c;增益误差&#xff0c;微分非线性…...

国产之光DeepSeek架构理解与应用分析

目录 初步探索DeepSeek的设计 一、核心架构设计 二、核心原理与优化 三、关键创新点 四、典型应用场景 五、与同类模型的对比优势 六、未来演进方向 从投入行业生产的角度看 一、DeepSeek的核心功能扩展 二、机械电子工程产业中的具体案例 1. 预测性维护&#xff08;Predictive…...

群晖NAS安卓Calibre 个人图书馆

docker 下载镜像johngong/calibre-web&#xff0c;安装之 我是本地的/docker/xxx/metadata目录 映射到 /usr/local/calibre-web/app/cps/metadata_provider CALIBREDB_OTHER_OPTION 删除 CALIBRE_SERVER_USER calibre_server_user 缺省用户名口令 admin admin123 另外有个N…...

openRv1126 AI算法部署实战之——Tensorflow模型部署实战

在RV1126开发板上部署Tensorflow算法&#xff0c;实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili ​ 一、准备工作 从官网下载tensorflow模型和数据集 手动在线下载&#xff1a; https://github.com/tensorflow/models/b…...

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号&#xff1a; 2、小于号 和 大于号&#xff1a; 3、引号&#xff1a; 二、版权、注册商标符号的使用 1、版权符号&#xff1a;© 2、注册商标符号&#xff1a; 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…...

如何对系统调用进行扩展?

扩展系统调用是操作系统开发中的一个重要任务。系统调用是用户程序与操作系统内核之间的接口,允许用户程序执行内核级操作(如文件操作、进程管理、内存管理等)。扩展系统调用通常包括以下几个步骤: 一、定义新系统调用 扩展系统调用首先需要定义新的系统调用的功能。系统…...

【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124

MFC界面全自动等比例缩放 1.在初始化里 枚举每个控件记录所有控件rect 2.在OnSize里&#xff0c;根据当前窗口和之前保存的窗口的宽高求比例x、y 3.枚举每个控件&#xff0c;根据比例x、y调整控件上下左右,并移动到新rect struct ControlInfo {CWnd* pControl;CRect original…...