JavaScript基于ChatGPT?API實(shí)現(xiàn)劃詞翻譯瀏覽器腳本
前言
最近 GitHub 上有個(gè)基于 ChatGPT API 的瀏覽器腳本, 短時(shí)間內(nèi) star 沖到了 9.7k, 功能上除了支持翻譯外,還支持潤(rùn)色和總結(jié)功能,除了瀏覽器插件外,還使用了 tauri 打包了一個(gè)桌面客戶端,那拋開 tauri 是使用 rust 部分,那瀏覽器部分實(shí)現(xiàn)還是比較簡(jiǎn)單的,今天我們就來(lái)手動(dòng)實(shí)現(xiàn)一下。
openAI 提供的接口
比如我們可以復(fù)制以下代碼,在瀏覽器控制臺(tái)中發(fā)起請(qǐng)求,就可以完成翻譯
//這是示例 const OPENAI_API_KEY = "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"; const prompt = `Translate this into Chinese: hello world`; const res = await fetch("https://api.openai.com/v1/completions", { method: "POST", headers: { "Content-Type": "application/json", authorization: `Bearer ${OPENAI_API_KEY}`, }, body: JSON.stringify({ model: "text-davinci-003", prompt, max_tokens: 1000, temperature: 0, }), }); const response = await res.json(); const result = response.choices[0].text;
上述代碼中 OPONAI_API_KEY 需要替換成你自己的。
實(shí)現(xiàn)劃詞翻譯
劃詞翻譯是一種常見(jiàn)的網(wǎng)頁(yè)功能,用戶選擇一個(gè)單詞或一段文本時(shí),自動(dòng)彈出一個(gè)小窗口,顯示該單詞或文本的翻譯。
1.首先,在 HTML 頁(yè)面中添加一個(gè)空的 DIV 元素和一個(gè)觸發(fā)翻譯的按鈕
let keyword; const translation = document.createElement("div"); translation.id ="translation"; const icon = document.createElement("img"); icon.style.width ="30px"; icon.style.height = "30px"; icon.src ="http://example.com/icon.png"; translation.appendChild(icon)
2.為頁(yè)面添加一個(gè)鼠標(biāo)抬起事件監(jiān)聽(tīng)器,當(dāng)用戶選擇一段文本時(shí),設(shè)置搜索關(guān)鍵詞。
document.addEventListener("mouseup", (event) => { const selection = window.getSelection().toString().trim(); if (selection) { keyword=selection; } });
3.鼠標(biāo)點(diǎn)擊執(zhí)行翻譯邏輯。可以使用 AJAX 請(qǐng)求從后臺(tái)獲取翻譯結(jié)果并將其顯示在 DIV 元素中。
function translate(){ if(keyword){ // 執(zhí)行翻譯邏輯 } } icon.addEventListener("mouseover", translate);
4.在 CSS 樣式表中為 DIV 元素添加樣式,使其浮動(dòng)在頁(yè)面上顯示。
#translation { position: fixed; top: 10px; right: 10px; max-width: 300px; padding: 5px; background-color: #f7f7f7; border: 1px solid #ccc; box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.1); z-index: 9999; }
以上這些步驟就能實(shí)現(xiàn)劃詞翻譯的基本功能,一起來(lái)看下效果。
react + antd 實(shí)現(xiàn)
上面的代碼只是實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的版本,樣式也不夠美觀,因此我們可以使用 webpack + react + antd 來(lái)實(shí)現(xiàn)一個(gè)現(xiàn)代化的插件, 這里我使用一個(gè)之前創(chuàng)建的模版tampermonkey-starter。
使用 antd 的 Popover 組件來(lái)顯示,使用 react 重構(gòu)下js代碼,我們就可以實(shí)現(xiàn)如下效果。
點(diǎn)擊翻譯按鈕,就會(huì)通過(guò)接口請(qǐng)求,將翻譯結(jié)果顯示在下方。但是翻譯結(jié)果需要等 api 完全返回,才會(huì)顯示出來(lái),這樣會(huì)等待較慢,我們可以使用 Stream,OpenAI 的接口支持流渲染嗎,這樣結(jié)果就會(huì)一個(gè)字一個(gè)字蹦出來(lái)。
import { createParser } from "eventsource-parser"; const translate = async (text: string) => { const resp = await fetch("https://api.openai.com/v1/completions", { method: "POST", headers: { "Content-Type": "application/json", authorization: `Bearer ${OPENAI_API_KEY}`, }, body: JSON.stringify({ model: "text-davinci-003", prompt: `Translate this into Chinese: ${text}`, max_tokens: 1000, temperature: 0, frequency_penalty: 0, stream: true, }), }); if (resp.status !== 200) { const res = await resp.json(); setLoading(false); console.error(res); return; } const parser = createParser((event) => { if (event.type === "event") { const data = event.data; if (data === "[DONE]") { setLoading(false); } try { let json = JSON.parse(event.data); setResult((prev) => { return prev + json.choices[0].text; }); } catch (error) { console.log(error); } } }); const data = resp.body; if (!data) { console.log("Error: No data received from API"); return; } const reader = resp.body.getReader(); try { while (true) { const { done, value } = await reader.read(); if (done) { setLoading(false); break; } const str = new TextDecoder().decode(value); parser.feed(str); } } finally { reader.releaseLock(); } };
在上面代碼中,我們使用 fetch
API 發(fā)送了一個(gè) HTTP 請(qǐng)求,并在響應(yīng)中獲取了一個(gè)可讀流。我們可以使用 getReader
方法獲取一個(gè)讀取器對(duì)象,并使用它來(lái)處理流數(shù)據(jù),使用了 eventsource-parser
這個(gè)包來(lái)解析服務(wù)器推送(Server-sent events)的數(shù)據(jù)。
這樣響應(yīng)的內(nèi)容就會(huì)根據(jù)Server-sent events(服務(wù)器發(fā)送的事件)逐個(gè)顯示了。
文本轉(zhuǎn)語(yǔ)音
一般翻譯插件都有語(yǔ)音播放的功能,我們可以利用 可以使用Web Speech API。此API提供了兩個(gè)語(yǔ)音合成接口:SpeechSynthesis
和SpeechSynthesisUtterance
function speak(text) { if ('speechSynthesis' in window) { const utterance = new SpeechSynthesisUtterance(text); utterance.voice = speechSynthesis.getVoices()[0]; utterance.pitch = 1; utterance.rate = 1; speechSynthesis.speak(utterance); } }
然后直接調(diào)用這個(gè)函數(shù),傳入需要朗讀的文本,就可以實(shí)現(xiàn)語(yǔ)音播放
speak('Hello, world!');
小結(jié)
本文介紹了如何實(shí)現(xiàn)劃詞翻譯的基本功能,包括使用 OpenAI 提供的接口進(jìn)行翻譯、在 HTML 頁(yè)面中添加觸發(fā)翻譯的按鈕和鼠標(biāo)抬起事件監(jiān)聽(tīng)事件、使用 AJAX 請(qǐng)求從接口獲取翻譯結(jié)果并將其顯示在 DIV 元素中等。同時(shí)還介紹了如何使用 webpack + react + antd 實(shí)現(xiàn)一個(gè)現(xiàn)代化的插件,并利用 Web Speech API 實(shí)現(xiàn)語(yǔ)音播放功能。
以上就是JavaScript基于ChatGPT API實(shí)現(xiàn)劃詞翻譯瀏覽器腳本的詳細(xì)內(nèi)容,更多關(guān)于JavaScript ChatGPT API現(xiàn)劃詞翻譯瀏覽器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- html+css+js實(shí)現(xiàn)簡(jiǎn)易版ChatGPT聊天機(jī)器人
- 兩天沒(méi)解決的問(wèn)題chatgpt用了5秒搞定隱藏bug
- 一文解析ChatGPT?之?Fetch?請(qǐng)求
- 讓chatGPT教你如何使用taro創(chuàng)建mbox
- LangChain簡(jiǎn)化ChatGPT工程復(fù)雜度使用詳解
- ChatGPT用于OA聊天助手導(dǎo)致訪問(wèn)量服務(wù)宕機(jī)
- 詳解微信小程序如何實(shí)現(xiàn)類似ChatGPT的流式傳輸
- ChatGPT前端編程秀之別拿編程語(yǔ)言不當(dāng)語(yǔ)言
- 詳解如何利用chatgpt保護(hù)您的js代碼
相關(guān)文章
js導(dǎo)出Excel表格超出26位英文字符的解決方法ES6
下面小編就為大家?guī)?lái)一篇js導(dǎo)出Excel表格超出26位英文字符的解決方法ES6。具有很好的參考價(jià)值。一起跟隨小編過(guò)來(lái)看看吧,希望對(duì)大家有所幫助2017-11-11webpack下實(shí)現(xiàn)動(dòng)態(tài)引入文件方法
下面小編就為大家分享一篇webpack下實(shí)現(xiàn)動(dòng)態(tài)引入文件方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02JavaScript實(shí)現(xiàn)圖片偽異步上傳過(guò)程解析
這篇文章主要介紹了javascript實(shí)現(xiàn)圖片偽異步上傳過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04JavaScript實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方式匯總
這篇文章主要介紹了JavaScript實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方式匯總的相關(guān)資料,需要的朋友可以參考下2016-05-05讓JavaScript的Alert彈出框失效的方法禁止彈出警告框
彈出框難免會(huì)影響你的心情,所以通過(guò)以下代碼可將Js彈出框屏蔽掉,實(shí)現(xiàn)思路是對(duì)alert方法重寫2014-09-09使用apply方法實(shí)現(xiàn)javascript中的對(duì)象繼承
javascript中的對(duì)象繼承的方法有很多,在接下來(lái)的文章中為大家介紹下使用apply方法是如何實(shí)現(xiàn)的2013-12-12基于JavaScript實(shí)現(xiàn)的希爾排序算法分析
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)的希爾排序算法,簡(jiǎn)單分析了希爾排序的原理并結(jié)合實(shí)例形式給出了javascript實(shí)現(xiàn)希爾排序的操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04淺述節(jié)點(diǎn)的創(chuàng)建及常見(jiàn)功能的實(shí)現(xiàn)
本文主要對(duì)節(jié)點(diǎn)的創(chuàng)建及常見(jiàn)功能的實(shí)現(xiàn)方法進(jìn)行介紹,希望會(huì)對(duì)大家學(xué)習(xí)javascript有所幫助,下面就跟小編一起來(lái)看下吧2016-12-12