OCR image captioning work
This commit is contained in:
parent
d46f08c189
commit
e72348f5d1
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "calckey",
|
"name": "calckey",
|
||||||
"version": "12.119.0-calc.5.1",
|
"version": "12.119.0-calc.6",
|
||||||
"codename": "aqua",
|
"codename": "aqua",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
|
@ -110,6 +110,7 @@
|
||||||
"summaly": "2.7.0",
|
"summaly": "2.7.0",
|
||||||
"syslog-pro": "1.0.0",
|
"syslog-pro": "1.0.0",
|
||||||
"systeminformation": "5.12.11",
|
"systeminformation": "5.12.11",
|
||||||
|
"tesseract.js": "^3.0.3",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
"tmp": "0.2.1",
|
"tmp": "0.2.1",
|
||||||
"ts-loader": "9.4.1",
|
"ts-loader": "9.4.1",
|
||||||
|
|
|
@ -113,6 +113,7 @@ import * as ep___drive from './endpoints/drive.js';
|
||||||
import * as ep___drive_files from './endpoints/drive/files.js';
|
import * as ep___drive_files from './endpoints/drive/files.js';
|
||||||
import * as ep___drive_files_attachedNotes from './endpoints/drive/files/attached-notes.js';
|
import * as ep___drive_files_attachedNotes from './endpoints/drive/files/attached-notes.js';
|
||||||
import * as ep___drive_files_checkExistence from './endpoints/drive/files/check-existence.js';
|
import * as ep___drive_files_checkExistence from './endpoints/drive/files/check-existence.js';
|
||||||
|
import * as ep___drive_files_captionImage from './endpoints/drive/files/caption-image.js';
|
||||||
import * as ep___drive_files_create from './endpoints/drive/files/create.js';
|
import * as ep___drive_files_create from './endpoints/drive/files/create.js';
|
||||||
import * as ep___drive_files_delete from './endpoints/drive/files/delete.js';
|
import * as ep___drive_files_delete from './endpoints/drive/files/delete.js';
|
||||||
import * as ep___drive_files_findByHash from './endpoints/drive/files/find-by-hash.js';
|
import * as ep___drive_files_findByHash from './endpoints/drive/files/find-by-hash.js';
|
||||||
|
@ -434,6 +435,7 @@ const eps = [
|
||||||
['drive', ep___drive],
|
['drive', ep___drive],
|
||||||
['drive/files', ep___drive_files],
|
['drive/files', ep___drive_files],
|
||||||
['drive/files/attached-notes', ep___drive_files_attachedNotes],
|
['drive/files/attached-notes', ep___drive_files_attachedNotes],
|
||||||
|
['drive/files/caption-image', ep___drive_files_captionImage],
|
||||||
['drive/files/check-existence', ep___drive_files_checkExistence],
|
['drive/files/check-existence', ep___drive_files_checkExistence],
|
||||||
['drive/files/create', ep___drive_files_create],
|
['drive/files/create', ep___drive_files_create],
|
||||||
['drive/files/delete', ep___drive_files_delete],
|
['drive/files/delete', ep___drive_files_delete],
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
import define from '../../../define.js';
|
||||||
|
import { createWorker } from 'tesseract.js';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
tags: ['drive'],
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
|
||||||
|
kind: 'read:drive',
|
||||||
|
|
||||||
|
description: 'Return caption of image',
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
},
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export const paramDef = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
url: { type: 'string' },
|
||||||
|
},
|
||||||
|
required: ['url'],
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
// eslint-disable-next-line import/no-default-export
|
||||||
|
export default define(meta, paramDef, async (ps) => {
|
||||||
|
|
||||||
|
const worker = createWorker({
|
||||||
|
logger: m => console.log(m)
|
||||||
|
});
|
||||||
|
|
||||||
|
await worker.load();
|
||||||
|
await worker.loadLanguage('eng');
|
||||||
|
await worker.initialize('eng');
|
||||||
|
const { data: { text } } = await worker.recognize(ps.url);
|
||||||
|
await worker.terminate();
|
||||||
|
|
||||||
|
return text;
|
||||||
|
});
|
|
@ -48,7 +48,6 @@
|
||||||
"stringz": "2.1.0",
|
"stringz": "2.1.0",
|
||||||
"swiper": "^8.4.4",
|
"swiper": "^8.4.4",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"tesseract.js": "^3.0.3",
|
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"three": "0.144.0",
|
"three": "0.144.0",
|
||||||
"throttle-debounce": "5.0.0",
|
"throttle-debounce": "5.0.0",
|
||||||
|
|
|
@ -11,9 +11,9 @@
|
||||||
</header>
|
</header>
|
||||||
<textarea id="captioninput" v-model="inputValue" autofocus :placeholder="input.placeholder" @keydown="onInputKeydown"></textarea>
|
<textarea id="captioninput" v-model="inputValue" autofocus :placeholder="input.placeholder" @keydown="onInputKeydown"></textarea>
|
||||||
<div v-if="(showOkButton || showCaptionButton || showCancelButton)" class="buttons">
|
<div v-if="(showOkButton || showCaptionButton || showCancelButton)" class="buttons">
|
||||||
<MkButton inline primary :disabled="remainingLength < 0" @click="ok">{{ $ts.ok }}</MkButton>
|
<MkButton inline primary :disabled="remainingLength < 0" @click="ok">{{ i18n.ts.ok }}</MkButton>
|
||||||
<!-- <MkButton inline @click="caption" >{{ $ts.caption }}</MkButton> -->
|
<MkButton inline @click="caption">{{ i18n.ts.caption }}</MkButton>
|
||||||
<MkButton inline @click="cancel" >{{ $ts.cancel }}</MkButton>
|
<MkButton inline @click="cancel">{{ i18n.ts.cancel }}</MkButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -33,7 +33,8 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import Tesseract from 'tesseract.js';
|
import { i18n } from '@/i18n';
|
||||||
|
import * as os from '@/os';
|
||||||
import MkModal from '@/components/MkModal.vue';
|
import MkModal from '@/components/MkModal.vue';
|
||||||
import MkButton from '@/components/MkButton.vue';
|
import MkButton from '@/components/MkButton.vue';
|
||||||
import bytes from '@/filters/bytes';
|
import bytes from '@/filters/bytes';
|
||||||
|
@ -141,37 +142,14 @@ export default defineComponent({
|
||||||
},
|
},
|
||||||
|
|
||||||
caption() {
|
caption() {
|
||||||
const getBase64FromUrl = async (url) => {
|
|
||||||
const data = await fetch(url);
|
|
||||||
const blob = await data.blob();
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
const reader = new FileReader();
|
|
||||||
reader.readAsDataURL(blob);
|
|
||||||
reader.onloadend = () => {
|
|
||||||
const base64data = reader.result;
|
|
||||||
resolve(base64data);
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const img = document.getElementById('imgtocaption') as HTMLImageElement;
|
const img = document.getElementById('imgtocaption') as HTMLImageElement;
|
||||||
const b64 = getBase64FromUrl(img.src);
|
os.api('drive/files/caption-image', {
|
||||||
console.log(b64);
|
url: img.src,
|
||||||
Tesseract.recognize(
|
}).then(text => {
|
||||||
b64,
|
document.getElementById('recognized-text').innerText = text;
|
||||||
'eng',
|
const allowedLength = 512 - this.inputValue.length;
|
||||||
{ logger: m => console.log(m) },
|
this.inputValue += text.slice(0, allowedLength);
|
||||||
).then(({ data: { text } }) => {
|
|
||||||
console.log(text);
|
|
||||||
});
|
});
|
||||||
// await worker.load();
|
|
||||||
// await worker.loadLanguage('eng');
|
|
||||||
// await worker.initialize('eng');
|
|
||||||
// const { data: { text } } = await worker.recognize(img);
|
|
||||||
// console.log(text);
|
|
||||||
// // document.getElementById('recognized-text').innerText = text;
|
|
||||||
// // const allowedLength = 512 - this.inputValue.length;
|
|
||||||
// // this.inputValue += text.slice(0, allowedLength);
|
|
||||||
// await worker.terminate();
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -20,7 +20,7 @@ async function follow(user): Promise<void> {
|
||||||
window.close();
|
window.close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
os.apiWithDialog('following/create', {
|
os.apiWithDialog('following/create', {
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
});
|
});
|
||||||
|
|
|
@ -3084,6 +3084,7 @@ __metadata:
|
||||||
summaly: 2.7.0
|
summaly: 2.7.0
|
||||||
syslog-pro: 1.0.0
|
syslog-pro: 1.0.0
|
||||||
systeminformation: 5.12.11
|
systeminformation: 5.12.11
|
||||||
|
tesseract.js: ^3.0.3
|
||||||
tinycolor2: 1.4.2
|
tinycolor2: 1.4.2
|
||||||
tmp: 0.2.1
|
tmp: 0.2.1
|
||||||
ts-loader: 9.4.1
|
ts-loader: 9.4.1
|
||||||
|
@ -4037,7 +4038,6 @@ __metadata:
|
||||||
stringz: 2.1.0
|
stringz: 2.1.0
|
||||||
swiper: ^8.4.4
|
swiper: ^8.4.4
|
||||||
syuilo-password-strength: 0.0.1
|
syuilo-password-strength: 0.0.1
|
||||||
tesseract.js: ^3.0.3
|
|
||||||
textarea-caret: 3.1.0
|
textarea-caret: 3.1.0
|
||||||
three: 0.144.0
|
three: 0.144.0
|
||||||
throttle-debounce: 5.0.0
|
throttle-debounce: 5.0.0
|
||||||
|
|
Loading…
Reference in New Issue