使用 HTML + JavaScript 實現文章逐句高亮朗讀功能

在這個信息爆炸的時代,我們每天都要面對大量的文字閱讀。無論是學習、工作還是個人成長,閱讀都扮演著至關重要的角色。然而,在快節奏的生活中,我們往往難以找到足夠的安靜時間專注于閱讀。本文用 HTML + JavaScript 實現了一個基于Web的語音文章朗讀器,為您帶來全新的閱讀體驗。

效果演示

image-20250603220304012

image-20250603220336133

項目核心

本項目主要包含以下核心功能:

  • 語音合成(Text-to-Speech)功能
  • 控制播放、暫停、繼續和停止操作
  • 語音選擇功能
  • 閱讀進度保存與恢復
  • 句子級高亮顯示
  • 點擊任意句子直接跳轉并朗讀

頁面結構

控制區域

包含所有操作按鈕(開始、暫停、繼續、停止、重置)和語音選擇下拉框。

<div class="controls"><button id="playBtn">開始朗讀</button><button id="pauseBtn" disabled>暫停</button><button id="resumeBtn" disabled>繼續</button><button id="stopBtn" disabled>停止</button><select id="voiceSelect" class="voice-select"></select><button id="resetBtn">重置進度</button>
</div>

文章區域

包含多個段落,每個段落由多個可交互的句子組成。

<div class="article" id="article"><p class="paragraph"><span class="sentence">在編程的世界里,學習是一個永無止境的過程。</span><span class="sentence">隨著技術的不斷發展,我們需要不斷更新自己的知識和技能。</span><span class="sentence">HTML、CSS和JavaScript是構建現代網頁的三大基石。</span></p><p class="paragraph"><span class="sentence">掌握這些基礎技術后,你可以進一步學習各種前端框架和工具。</span><span class="sentence">React、Vue和Angular是目前最流行的前端框架。</span><span class="sentence">它們都采用了組件化的開發模式,提高了代碼的可維護性和復用性。</span></p><p class="paragraph"><span class="sentence">除了前端技術,后端開發也是全棧工程師必須掌握的技能。</span><span class="sentence">Node.js讓JavaScript可以用于服務器端編程,大大擴展了JavaScript的應用范圍。</span><span class="sentence">數據庫技術也是開發中的重要組成部分。</span></p>
</div>
進度信息

顯示當前閱讀進度。

<div class="progress-info">當前進度: <span id="progressText">0/0</span><div class="progress-bar-container"><div class="progress-bar"></div></div>
</div>

核心功能實現

定義基礎變量

獲取DOM元素

const sentences = document.querySelectorAll('.sentence');
const playBtn = document.getElementById('playBtn');
const pauseBtn = document.getElementById('pauseBtn');
const resumeBtn = document.getElementById('resumeBtn');
const stopBtn = document.getElementById('stopBtn');
const resetBtn = document.getElementById('resetBtn');
const voiceSelect = document.getElementById('voiceSelect');
const progressText = document.getElementById('progressText');
const progressBar = document.querySelector('.progress-bar');

定義語音合成相關變量

let speechSynthesis = window.speechSynthesis;
let voices = [];
let currentUtterance = null;
let currentSentenceIndex = 0;
let isPaused = false;
語音合成初始化

通過 window.speechSynthesis API 獲取系統支持的語音列表,并填充到下拉選擇框中。

function initSpeechSynthesis() {// 獲取可用的語音列表voices = speechSynthesis.getVoices();// 填充語音選擇下拉框voiceSelect.innerHTML = '';voices.forEach((voice, index) => {const option = document.createElement('option');option.value = index;option.textContent = `${voice.name} (${voice.lang})`;voiceSelect.appendChild(option);});// 嘗試選擇中文語音const chineseVoice = voices.find(voice =>{voice.lang.includes('zh') || voice.lang.includes('cmn')});if (chineseVoice) {const voiceIndex = voices.indexOf(chineseVoice);voiceSelect.value = voiceIndex;}
}
句子朗讀功能
function speakSentence(index) {if (index >= sentences.length || index < 0) return;// 停止當前朗讀if (currentUtterance) {speechSynthesis.cancel();}// 更新當前句子高亮updateHighlight(index);// 創建新的語音合成實例const selectedVoiceIndex = voiceSelect.value;const utterance = new SpeechSynthesisUtterance(sentences[index].textContent);if (voices[selectedVoiceIndex]) {utterance.voice = voices[selectedVoiceIndex];}utterance.rate = 0.9; // 稍微慢一點的語速// 朗讀開始時的處理utterance.onstart = function() {sentences[index].classList.add('reading');playBtn.disabled = true;pauseBtn.disabled = false;resumeBtn.disabled = true;stopBtn.disabled = false;};// 朗讀結束時的處理utterance.onend = function() {sentences[index].classList.remove('reading');if (!isPaused) {if (currentSentenceIndex >= sentences.length - 1) {// 朗讀完成playBtn.disabled = false;pauseBtn.disabled = true;resumeBtn.disabled = true;stopBtn.disabled = true;updateProgressText();return;}currentSentenceIndex++;saveProgress();speakSentence(currentSentenceIndex);}};// 開始朗讀currentUtterance = utterance;speechSynthesis.speak(utterance);updateProgressText();
}
句子高亮功能
function updateHighlight(index) {sentences.forEach((sentence, i) => {sentence.classList.remove('current');if (i === index) {sentence.classList.add('current');// 滾動到當前句子sentence.scrollIntoView({ behavior: 'smooth', block: 'center' });}});
}
更新進度文本
function updateProgressText() {progressText.textContent = `${currentSentenceIndex + 1}/${sentences.length}`;const percentage = (currentSentenceIndex + 1) / sentences.length * 100;progressBar.style.width = `${percentage}%`;
}
進度保存與恢復

保存進度到本地存儲

function saveProgress() {localStorage.setItem('readingProgress', currentSentenceIndex);localStorage.setItem('articleId', 'demoArticle'); updateProgressText();
}

從本地存儲加載進度

function loadProgress() {const savedArticleId = localStorage.getItem('articleId');if (savedArticleId === 'demoArticle') {const savedProgress = localStorage.getItem('readingProgress');if (savedProgress !== null) {currentSentenceIndex = parseInt(savedProgress);if (currentSentenceIndex >= sentences.length) {currentSentenceIndex = 0;}updateHighlight(currentSentenceIndex);updateProgressText();}}
}
點擊句子朗讀跳轉功能
sentences.forEach((sentence, index) => {sentence.addEventListener('click', function() {currentSentenceIndex = index;speakSentence(currentSentenceIndex);});
});

擴展建議

  • 語速調節:增加語速調節滑塊,讓用戶自定義朗讀速
  • 多語言支持:自動檢測文本語言并選擇合適的語音引擎
  • 斷句優化:改進自然語言處理邏輯,使朗讀更符合口語習慣
  • 多文章支持:擴展文章管理系統,允許用戶選擇不同文章進行朗讀

完整代碼

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文章逐句高亮朗讀</title><style>body {font-family: 'Microsoft YaHei', sans-serif;line-height: 1.6;max-width: 800px;margin: 0 auto;padding: 40px 20px;color: #333;height: 100vh;box-sizing: border-box;background: linear-gradient(to bottom right, #f8f9fa, #e9ecef);}h1 {text-align: center;color: #2c3e50;margin-bottom: 40px;font-size: 2.5em;letter-spacing: 2px;position: relative;animation: fadeInDown 1s ease-out forwards;}@keyframes fadeInDown {from {opacity: 0;transform: translateY(-30px);}to {opacity: 1;transform: translateY(0);}}h1::after {content: '';display: block;width: 100px;height: 4px;background: linear-gradient(to right, #3498db, #2980b9);margin: 15px auto 0;border-radius: 2px;animation: growLine 1s ease-out forwards;}@keyframes growLine {from {width: 0;}to {width: 100px;}}.controls {box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);border-radius: 10px;padding: 20px;background-color: #ffffffcc;display: flex;flex-direction: column;gap: 15px;margin-bottom: 30px;}.controls > div {display: flex;flex-wrap: wrap;justify-content: center;gap: 15px;}button {padding: 10px 20px;background: linear-gradient(135deg, #3498db, #2980b9);color: white;border: none;border-radius: 25px;cursor: pointer;font-size: 16px;transition: all 0.3s ease-in-out;box-shadow: 0 4px 6px rgba(52, 152, 219, 0.3);}button:hover {transform: translateY(-2px);box-shadow: 0 6px 12px rgba(52, 152, 219, 0.4);}button:disabled {background: linear-gradient(135deg, #95a5a6, #7f8c8d);box-shadow: none;transform: none;}.article {font-size: 18px;line-height: 1.8;background-color: #ffffffee;border-radius: 10px;padding: 25px;margin-top: 30px;box-shadow: 0 8px 20px rgba(0, 0, 0, 0.05);margin-bottom: 30px;position: relative;z-index: 0}.article::before {content: '';position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: radial-gradient(circle at top left, rgba(52, 152, 219, 0.05) 0%, transparent 100%);z-index: -1;border-radius: 10px;}.paragraph {margin-bottom: 20px;}.sentence {border-radius: 3px;transition: all 0.3s ease-in-out;cursor: pointer;position: relative;z-index: 1;}.sentence:hover {background-color: #f0f0f0;}.sentence::after {content: '';position: absolute;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(255, 255, 255, 0.3);opacity: 0;z-index: -1;transition: opacity 0.3s ease-in-out;}.sentence:hover::after {opacity: 1;}.current {background-color: #fffde7 !important;font-weight: bold;transform: scale(1.05);box-shadow: 0 2px 8px rgba(255, 221, 0, 0.3);}.progress-info {text-align: center;margin-top: 20px;font-size: 14px;color: #7f8c8d;}select {padding: 8px;border-radius: 4px;border: 1px solid #bdc3c7;font-size: 16px;}.voice-select {min-width: 220px;padding: 10px 12px;border-radius: 25px;border: 1px solid #bdc3c7;font-size: 16px;background-color: #f8f9fa;transition: all 0.3s ease-in-out;appearance: none;background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24'%3E%3Cpath fill='%23555' d='M7 10l5 5 5-5z'/%3E%3C/svg%3E");background-repeat: no-repeat;background-position: right 15px center;background-size: 12px;display: block;margin: 0 auto;}.voice-select:focus {outline: none;border-color: #3498db;box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2);}.progress-info {text-align: center;margin-top: 30px;font-size: 14px;color: #7f8c8d;position: relative;height: 30px;}.progress-bar-container {width: 100%;height: 6px;background-color: #ecf0f1;border-radius: 3px;overflow: hidden;margin: 10px 0;}.progress-bar {height: 100%;width: 0;background: linear-gradient(to right, #3498db, #2980b9);transition: width 0.3s ease-in-out;}</style>
</head>
<body>
<h1>文章逐句高亮朗讀</h1><div class="controls"><div><button id="playBtn">開始朗讀</button><button id="pauseBtn" disabled>暫停</button><button id="resumeBtn" disabled>繼續</button><button id="stopBtn" disabled>停止</button><button id="resetBtn">重置進度</button></div><select id="voiceSelect" class="voice-select"></select>
</div><div class="article" id="article"><p class="paragraph"><span class="sentence">在編程的世界里,學習是一個永無止境的過程。</span><span class="sentence">隨著技術的不斷發展,我們需要不斷更新自己的知識和技能。</span><span class="sentence">HTML、CSS和JavaScript是構建現代網頁的三大基石。</span></p><p class="paragraph"><span class="sentence">掌握這些基礎技術后,你可以進一步學習各種前端框架和工具。</span><span class="sentence">React、Vue和Angular是目前最流行的前端框架。</span><span class="sentence">它們都采用了組件化的開發模式,提高了代碼的可維護性和復用性。</span></p><p class="paragraph"><span class="sentence">除了前端技術,后端開發也是全棧工程師必須掌握的技能。</span><span class="sentence">Node.js讓JavaScript可以用于服務器端編程,大大擴展了JavaScript的應用范圍。</span><span class="sentence">數據庫技術也是開發中的重要組成部分。</span></p>
</div><div class="progress-info">當前進度: <span id="progressText">0/0</span><div class="progress-bar-container"><div class="progress-bar"></div></div>
</div><script>document.addEventListener('DOMContentLoaded', function() {// 獲取DOM元素const sentences = document.querySelectorAll('.sentence');const playBtn = document.getElementById('playBtn');const pauseBtn = document.getElementById('pauseBtn');const resumeBtn = document.getElementById('resumeBtn');const stopBtn = document.getElementById('stopBtn');const resetBtn = document.getElementById('resetBtn');const voiceSelect = document.getElementById('voiceSelect');const progressText = document.getElementById('progressText');const progressBar = document.querySelector('.progress-bar');// 語音合成相關變量let speechSynthesis = window.speechSynthesis;let voices = [];let currentUtterance = null;let currentSentenceIndex = 0;let isPaused = false;// 從本地存儲加載進度loadProgress();// 初始化語音合成function initSpeechSynthesis() {// 獲取可用的語音列表voices = speechSynthesis.getVoices();// 填充語音選擇下拉框voiceSelect.innerHTML = '';voices.forEach((voice, index) => {const option = document.createElement('option');option.value = index;option.textContent = `${voice.name} (${voice.lang})`;voiceSelect.appendChild(option);});// 嘗試選擇中文語音const chineseVoice = voices.find(voice =>{voice.lang.includes('zh') || voice.lang.includes('cmn')});if (chineseVoice) {const voiceIndex = voices.indexOf(chineseVoice);voiceSelect.value = voiceIndex;}}// 語音列表加載可能需要時間speechSynthesis.onvoiceschanged = initSpeechSynthesis;initSpeechSynthesis();// 朗讀指定句子function speakSentence(index) {if (index >= sentences.length || index < 0) return;// 停止當前朗讀if (currentUtterance) {speechSynthesis.cancel();}// 更新當前句子高亮updateHighlight(index);// 創建新的語音合成實例const selectedVoiceIndex = voiceSelect.value;const utterance = new SpeechSynthesisUtterance(sentences[index].textContent);if (voices[selectedVoiceIndex]) {utterance.voice = voices[selectedVoiceIndex];}utterance.rate = 0.9; // 稍微慢一點的語速// 朗讀開始時的處理utterance.onstart = function() {sentences[index].classList.add('reading');playBtn.disabled = true;pauseBtn.disabled = false;resumeBtn.disabled = true;stopBtn.disabled = false;};// 朗讀結束時的處理utterance.onend = function() {sentences[index].classList.remove('reading');if (!isPaused) {if (currentSentenceIndex >= sentences.length - 1) {// 朗讀完成playBtn.disabled = false;pauseBtn.disabled = true;resumeBtn.disabled = true;stopBtn.disabled = true;updateProgressText();return;}currentSentenceIndex++;saveProgress();speakSentence(currentSentenceIndex);}};// 開始朗讀currentUtterance = utterance;speechSynthesis.speak(utterance);updateProgressText();}// 更新句子高亮function updateHighlight(index) {sentences.forEach((sentence, i) => {sentence.classList.remove('current');if (i === index) {sentence.classList.add('current');// 滾動到當前句子sentence.scrollIntoView({ behavior: 'smooth', block: 'center' });}});}// 更新進度文本function updateProgressText() {progressText.textContent = `${currentSentenceIndex + 1}/${sentences.length}`;const percentage = (currentSentenceIndex + 1) / sentences.length * 100;progressBar.style.width = `${percentage}%`;}// 保存進度到本地存儲function saveProgress() {localStorage.setItem('readingProgress', currentSentenceIndex);localStorage.setItem('articleId', 'demoArticle'); // 在實際應用中可以使用文章IDupdateProgressText();}// 從本地存儲加載進度function loadProgress() {const savedArticleId = localStorage.getItem('articleId');if (savedArticleId === 'demoArticle') {const savedProgress = localStorage.getItem('readingProgress');if (savedProgress !== null) {currentSentenceIndex = parseInt(savedProgress);if (currentSentenceIndex >= sentences.length) {currentSentenceIndex = 0;}updateHighlight(currentSentenceIndex);updateProgressText();}}}// 事件監聽器playBtn.addEventListener('click', function() {currentSentenceIndex = 0;speakSentence(currentSentenceIndex);});pauseBtn.addEventListener('click', function() {if (speechSynthesis.speaking && !isPaused) {speechSynthesis.pause();isPaused = true;pauseBtn.disabled = true;resumeBtn.disabled = false;}});resumeBtn.addEventListener('click', function() {if (isPaused) {speechSynthesis.resume();isPaused = false;pauseBtn.disabled = false;resumeBtn.disabled = true;}});stopBtn.addEventListener('click', function() {speechSynthesis.cancel();isPaused = false;playBtn.disabled = false;pauseBtn.disabled = true;resumeBtn.disabled = true;stopBtn.disabled = true;// 移除所有朗讀樣式sentences.forEach(sentence => {sentence.classList.remove('reading');});});resetBtn.addEventListener('click', function() {localStorage.removeItem('readingProgress');localStorage.removeItem('articleId');currentSentenceIndex = 0;updateHighlight(currentSentenceIndex);updateProgressText();});// 點擊句子跳轉到該句子并朗讀sentences.forEach((sentence, index) => {sentence.addEventListener('click', function() {currentSentenceIndex = index;speakSentence(currentSentenceIndex);});});});
</script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84057.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

理解非結構化文檔:將 Reducto 解析與 Elasticsearch 結合使用

作者&#xff1a;來自 Elastic Adel Wu 演示如何將 Reducto 的文檔處理與 Elasticsearch 集成以實現語義搜索。 Elasticsearch 與業界領先的生成式 AI 工具和提供商有原生集成。歡迎觀看我們的網絡研討會&#xff0c;了解如何超越 RAG 基礎&#xff0c;或使用 Elastic 向量數據…

從Copilot到Agent,AI Coding是如何進化的?

編程原本是一項具有一定門檻的技能&#xff0c;但借助 AI Coding 產品&#xff0c;新手也能寫出可運行的代碼&#xff0c;非專業人員如業務分析師、產品經理&#xff0c;也能在 AI 幫助下直接生成簡單應用。 這一演變對軟件產業產生了深遠影響。當 AI 逐步參與代碼生成、調試乃…

UGUI Text/TextMeshPro字體組件

UGUI Text組件的不當使用及其性能瓶頸與優化 在Unity UGUI系統中&#xff0c;Text 組件&#xff08;或其升級版 TextMeshPro&#xff09;是顯示文本信息的核心元素。然而&#xff0c;如果不當使用&#xff0c;它極易成為UI性能瓶頸的罪魁禍首&#xff0c;尤其是在預制體、屬性…

淺談 React Hooks

React Hooks 是 React 16.8 引入的一組 API&#xff0c;用于在函數組件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通過簡潔的函數接口&#xff0c;解決了狀態與 UI 的高度解耦&#xff0c;通過函數式編程范式實現更靈活 Rea…

【個人筆記】數據庫原理(西電)

寫在前面&#xff1a;文中提到的頁面指向&#xff08;如“p45”&#xff09;&#xff0c;除特別說明&#xff0c;都是指對應ppt上的頁面&#xff0c;非同款ppt的友友可忽略 第一章 ER圖和關系分解見課本p69 ER圖是常用的 概念模型 方形&#xff1a;實體圓形&#xff1a;屬性…

SDC命令詳解:使用set_propagated_clock命令進行約束

相關閱讀 SDC命令詳解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目錄 指定端口列表/集合 簡單使用 注意事項 傳播時鐘是在進行了時鐘樹綜合后&#xff0c;使用set_propagated_clock命令可以將一個理想時鐘轉換為傳播時鐘&#x…

關于華為倉頡編程語言

文章目錄 一、基本概況二、技術特點1. 多范式編程2. 原生智能化3. 高性能與安全4. 全場景兼容 三、編譯器與開發工具四、語言相似性對比五、行業應用實例總結 最近經常看到這個東西&#xff0c;于是搜了一下&#xff0c;整理了一些內容&#xff0c;水一篇&#xff0c;以后慢慢研…

【STM32F1標準庫】理論——定時器中的輸出比較

目錄 一、定時器的輸出比較介紹&#xff08;Output Compare&#xff09; 1.整體簡介 2.輸出比較單元具體功能框圖 3.以PWM模式1舉例 二、雜談 1.CCR的全名 2.PWM簡介 3.舵機簡介 4.直流電機及驅動模塊TB6612簡介 一、定時器的輸出比較介紹&#xff08;Output Compare…

前端開發面試題總結-HTML篇

文章目錄 HTML面試高頻問答一、HTML 的 src 和 href 屬性有什么區別?二、什么是 HTML 語義化?三、HTML的 script 標簽中 defer 和 async 有什么區別?四、HTML5 相比于 HTML有哪些更新?五、HTML行內元素有哪些? 塊級元素有哪些? 空(void)元素有哪些?六、iframe有哪些優點…

Scrapy爬蟲教程(新手)

1. Scrapy的核心組成 引擎&#xff08;engine&#xff09;&#xff1a;scrapy的核心&#xff0c;所有模塊的銜接&#xff0c;數據流程梳理。 調度器&#xff08;scheduler&#xff09;&#xff1a;本質可以看成一個集合和隊列&#xff0c;里面存放著一堆即將要發送的請求&#…

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測

Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測 目錄 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型時序預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五…

歷史數據分析——唐山港

個股簡介 公司簡介: 唐山港口投資有限公司、北京京泰投資管理中心、河北利豐燕山投資管理中心、國富投資公司、唐山市建設投資公司、河北省建設投資公司、國投交通實業公司7家發起人共同發起設立。 經營分析: 港口經營一般項目:港口貨物裝卸搬運活動;普通貨物倉儲服務(不含…

云端回聲消除:讓超低端硬件能玩實時打斷

傳統認知里“優質交互 高性能硬件”的等式正在被打破&#xff1f; 超低端開發板也能實現高配置硬件才有的實時打斷語音交互&#xff1f; 網易云信推出的云端回聲消除技術不僅解決了硬件配置對交互體驗的限制&#xff0c;更以系統性解決方案重構了嵌入式設備的實時對話體驗。 困…

堆排序的詳細解讀

一.堆的基本概念 1.什么是堆 堆是一種特殊的完全二叉樹&#xff0c;滿足一下性質&#xff1a; 最大堆&#xff1a;每個節點的值都大于或等于其子節點的值&#xff08;堆頂元素最大&#xff09;最小堆&#xff1a;每個節點的值都小于或等于其子節點的值&#xff08;堆頂元素最小…

hmdp知識點

1. 前置知識 1.1 MyBatisPlus的基本使用 1.1.1 引入依賴 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency> 1.1.2 建立實體類和數…

分享5個免費5個在線工具網站:Docsmall、UIED Tool在線工具箱、草料二維碼、圖片在線壓縮、表情符號

01. Docsmall 它是一個免費的在線圖片與PDF處理工具&#xff0c;功能主要包含Ai圖片處理工具&#xff0c;圖片壓縮工具&#xff0c;圖片PDF格式轉換工具等&#xff0c;如下圖&#xff0c;我認為比較實用的是自動摳圖、圖片變高清、圖片壓縮和PDF壓縮。 https://docsmall.com/…

打通印染車間“神經末梢”:DeviceNet轉Ethernet/IP連接機器人的高效方案

在印染行業自動化升級中&#xff0c;設備聯網需求迫切。老舊印染設備多采用Devicenet協議&#xff0c;而新型工業機器人普遍支持Ethernet/IP協議&#xff0c;協議不兼容導致數據交互困難&#xff0c;設備協同效率低、生產監控滯后&#xff0c;成了行業數字化轉型的阻礙。本文將…

RSA加密算法:非對稱密碼學的基石

一、RSA算法概述 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是1977年由Ron Rivest、Adi Shamir和Leonard Adleman提出的非對稱加密算法&#xff0c;它基于大數分解的數學難題&#xff0c;是當今應用最廣泛的公鑰密碼系統。RSA的核心思想是使用一對密鑰&#xff08;公鑰…

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動,用于空調風門電機驅動,香薰電機驅動

杭州瑞盟 MS35774/MS35774A 低噪聲256細分微步進電機驅動&#xff0c;用于空調風門電機驅動&#xff0c;香薰電機驅動 簡述 MS35774/MS35774A 是一款高精度、低噪聲的兩相步進 電機驅動芯片&#xff0c;芯片內置功率 MOSFET &#xff0c;長時間工作的平均電 流可以達到 1…

駛向智能未來:車載 MCP 服務與邊緣計算驅動的駕駛數據交互新體驗

引言 在人工智能技術與車載算力持續突破的驅動下&#xff0c;現代車輛的數字化進程正加速推進。車聯網系統將突破傳統云端架構的局限&#xff0c;依托邊緣計算與 AI 融合技術&#xff0c;實現人車交互體驗的范式重構?。通過構建基于多源異構數據的自動化分析框架&#xff0c;…