从服务端异步翻译

This commit is contained in:
2023-03-03 09:38:56 +08:00
parent 59d8beb5f3
commit f34ab21bb1
5 changed files with 119 additions and 32 deletions

View File

@@ -15,24 +15,15 @@ export default defineNuxtConfig({
},
nitro: {
devProxy: {
'/api': {
target: 'http://106.15.192.42:3000/api'
'/api/img': {
target: 'http://106.15.192.42:3000/api/img'
},
'/api/drawing': {
target: 'http://106.15.192.42:3000/api/drawing'
},
'/api/text': {
target: 'http://139.224.128.24:7861//api/text_to_text'
},
},
}
},
},
//devServer: {
// host: '106.15.192.42',
// port: 3000,
// url: 'http://106.15.192.42:3000'
//},
//vite: {
// server: {
// proxy: {
// '/api': {
// target: 'http://106.15.192.42:3000',
// changeOrigin: true
// }
// }
// }
//}
})

63
package-lock.json generated
View File

@@ -1,6 +1,8 @@
{
"requires": true,
"name": "drawing",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@ampproject/remapping": {
"version": "2.2.0",
@@ -1356,6 +1358,11 @@
"integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
"dev": true
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"autoprefixer": {
"version": "10.4.13",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
@@ -1370,6 +1377,16 @@
"postcss-value-parser": "^4.2.0"
}
},
"axios": {
"version": "1.3.4",
"resolved": "https://registry.npmmirror.com/axios/-/axios-1.3.4.tgz",
"integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
"requires": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"babel-walk": {
"version": "3.0.0-canary-5",
"resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz",
@@ -1905,6 +1922,14 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
@@ -2230,6 +2255,11 @@
"integrity": "sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==",
"dev": true
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -2795,8 +2825,17 @@
"follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"dev": true
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
},
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
"formdata-polyfill": {
"version": "4.0.10",
@@ -3869,6 +3908,19 @@
"integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
"dev": true
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.52.0"
}
},
"mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
@@ -4835,6 +4887,11 @@
"integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==",
"dev": true
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",

View File

@@ -22,5 +22,8 @@
"url": "gitea@git.satori.love:gameui/drawing.git"
},
"author": "satori.love",
"license": "MIT"
"license": "MIT",
"dependencies": {
"axios": "^1.3.4"
}
}

View File

@@ -216,7 +216,7 @@ const imageCreate = ref({
const new_task = ref({
model: 'SD2', // 模型
ckpt: '768-v-ema', // 风格参数
prompt: 'A tabby cat, with a fluffy tail, basking in the sun, bright, warm, very cute!', // 渲染提示词
prompt: '一只猫, 汤姆', // 渲染提示词
exclude: 'puppets, death, decay, mess', // 排除词汇
number: 1, // 生成图片数量
width: 512, // 图片宽度
@@ -282,10 +282,32 @@ const ModelsSelect = (index, model) => {
imageCreate.value.models_show = false
}
//// 判断是否为中文
//const isChinese = (str) => {
// var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/;
// return reg.test(str);
//}
//
//// 判断是否为英文
//const isEnglish = (str) => {
// var reg = /^[a-zA-Z]+$/;
// return reg.test(str);
//}
//
//// 翻译中文为英文
//const translate = async (str) => {
// let res = await fetch('/api/text?zh='+encodeURIComponent(str))
// let data = await res.json()
// return data.en
//}
// 提交新任务
const TaskSubmit = () => {
let data = new_task.value
data.exclude = imageCreate.value.exclude_on ? '' : data.exclude // 是否启用排除词汇
const TaskSubmit = async () => {
const data = Object.assign({}, new_task.value) // 复制一份来修改
//data.prompt = isChinese(data.prompt) ? await translate(data.prompt) : data.prompt // 翻译中文为英文
data.exclude = imageCreate.value.exclude_on ? data.exclude : '' // 是否启用排除词汇
console.log(data)
fetch('/api/drawing', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
@@ -299,7 +321,6 @@ const TaskSubmit = () => {
console.log(data.id, data.status, data.progress)
tasks.value = tasks.value.map(x => x.id == data.id ? data : x)
if (data.status == 'done') {
//data.data = ['https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png']
window.clearInterval(t2)
}
})

View File

@@ -1,3 +1,4 @@
import axios from 'axios'
export default defineEventHandler(async event => {
// 获取任务列表的状态进度(普通用户只能看到自己的)
@@ -20,9 +21,18 @@ export default defineEventHandler(async event => {
return tasks
}
// 翻译中文到英文
const translate = async (text: string, callback:Function) => {
if (!/^[a-zA-Z]+$/.test(text)) return
text = encodeURIComponent(text)
const {data} = await axios.get(`http://139.224.128.24:7861//api/text_to_text?zh=${text}`)
if (callback) callback(data.en)
return data.en
}
// 添加任务到队列(生成一个32位随机字符串作为任务ID)
if (event.node.req.method === 'POST') {
const {
let {
model = 'SD2', // 模型
ckpt = '768-v-ema', // 风格
image = '', // 图片数据(img2img)
@@ -39,14 +49,19 @@ export default defineEventHandler(async event => {
const id = Math.random().toString(36).substring(2, 34) // 生成随机任务ID
const uid = 1234567890 // 用户ID
const createdAt = new Date().getTime() // 设定创建时间
const status = 'waiting' // 任务状态
const status = 'translate' // 任务状态(翻译)
const progress = 0.00 // 任务进度
const data:any[] = [] // 生成结果
const task = { model, ckpt, image, prompt, remove, number, width, height, seed, sampler, prompt_guidance, quality_details, id, uid, createdAt, status, progress, data }
console.log('task:', task)
await useStorage().setItem(`task:${task.id}`, task) // 保存任务到内存
const tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:')))
console.log('tasks:', tasks)
translate(prompt, (en: string) => {
task.prompt = en
task.status = 'waiting' // 任务状态(排队)
useStorage().setItem(`task:${task.id}`, task) // 修改任务状态
})
//const tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:')))
//console.log('tasks:', tasks)
return task
}