129 lines
3.6 KiB
Go
129 lines
3.6 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
type OcrResult struct {
|
|
ImagePath string
|
|
TextPath string
|
|
Text string
|
|
Translate string
|
|
ErrReason string
|
|
}
|
|
|
|
func runPythonScript(script string) (string, error) {
|
|
cmd := exec.Command("python", "-c", script)
|
|
cmd.Dir = `C:\Users\kenny\Documents\git\messpy\VRC\VRWT_Tool\VRC_OSC`
|
|
out, err := cmd.CombinedOutput()
|
|
if len(out) > 0 {
|
|
log.Printf("python output: %s", string(out))
|
|
}
|
|
if err != nil {
|
|
return string(out), fmt.Errorf("python failed: %w", err)
|
|
}
|
|
return string(out), nil
|
|
}
|
|
|
|
func capturePythonOcr() (map[string]any, error) {
|
|
script := `
|
|
import sys, json
|
|
from pathlib import Path
|
|
root = Path(r"C:\Users\kenny\Documents\git\messpy\VRC\VRWT_Tool\VRC_OSC")
|
|
sys.path.insert(0, str(root / "src"))
|
|
from ocr.ocr_actions import runOcrFromScreen
|
|
result = runOcrFromScreen()
|
|
print(json.dumps(result, ensure_ascii=False))
|
|
`
|
|
out, err := runPythonScript(script)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
lines := strings.Split(strings.TrimSpace(out), "\n")
|
|
for i := len(lines) - 1; i >= 0; i-- {
|
|
line := strings.TrimSpace(lines[i])
|
|
if strings.HasPrefix(line, "{") && strings.HasSuffix(line, "}") {
|
|
var m map[string]any
|
|
if err := json.Unmarshal([]byte(line), &m); err == nil {
|
|
return m, nil
|
|
}
|
|
}
|
|
}
|
|
return nil, fmt.Errorf("ocr result json not found")
|
|
}
|
|
|
|
func runPythonOcrFromScreen() error {
|
|
log.Printf("ocr trigger begin")
|
|
result, err := capturePythonOcr()
|
|
if err != nil {
|
|
log.Printf("ocr trigger failed: %v", err)
|
|
SetOCRText("OCRテキストなし")
|
|
SetTranslateText("翻訳エンジン未設定")
|
|
_ = AppendRuntimeLog("OCR ERROR", err.Error())
|
|
return err
|
|
}
|
|
text, _ := result["text"].(string)
|
|
imagePath, _ := result["image_path"].(string)
|
|
textPath, _ := result["text_path"].(string)
|
|
if strings.TrimSpace(text) == "" {
|
|
text = "OCRテキストなし"
|
|
}
|
|
SetOCRText(text)
|
|
SetTranslateText("")
|
|
_ = AppendRuntimeLog("OCR INPUT", fmt.Sprintf("image=%s\n%s", imagePath, text))
|
|
if textPath != "" {
|
|
_ = AppendRuntimeLog("OCR TEXT", fmt.Sprintf("image=%s\ntext_path=%s\n%s", imagePath, textPath, text))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func runPythonTranslationFromLastOCR() error {
|
|
runtime := SnapshotRuntime()
|
|
source := strings.TrimSpace(runtime.LastOCRText)
|
|
if source == "" || source == "OCRテキストなし" {
|
|
SetTranslateText("OCRテキストなし")
|
|
_ = AppendRuntimeLog("TRANSLATION ERROR", "OCRテキストなし")
|
|
return nil
|
|
}
|
|
|
|
log.Printf("translation trigger begin")
|
|
SetTranslateText("翻訳実行中")
|
|
_ = AppendRuntimeLog("TRANSLATION INPUT", source)
|
|
script := `
|
|
import sys, json
|
|
from pathlib import Path
|
|
root = Path(r"C:\Users\kenny\Documents\git\messpy\VRC\VRWT_Tool\VRC_OSC")
|
|
sys.path.insert(0, str(root / "src"))
|
|
from translate.translate_actions import translateTextToJapanese, saveTranslationText
|
|
text = sys.argv[1]
|
|
translated = translateTextToJapanese(text)
|
|
print(translated or "")
|
|
if translated:
|
|
saveTranslationText("runtime", translated)
|
|
`
|
|
cmd := exec.Command("python", "-c", script, source)
|
|
cmd.Dir = `C:\Users\kenny\Documents\git\messpy\VRC\VRWT_Tool\VRC_OSC`
|
|
out, err := cmd.CombinedOutput()
|
|
if len(out) > 0 {
|
|
log.Printf("translation output: %s", string(out))
|
|
}
|
|
if err != nil {
|
|
SetTranslateText("翻訳失敗")
|
|
_ = AppendRuntimeLog("TRANSLATION ERROR", err.Error())
|
|
return err
|
|
}
|
|
translated := strings.TrimSpace(string(out))
|
|
if translated == "" {
|
|
SetTranslateText("翻訳結果なし")
|
|
_ = AppendRuntimeLog("TRANSLATION ERROR", "翻訳結果なし")
|
|
return nil
|
|
}
|
|
SetTranslateText(translated)
|
|
_ = AppendRuntimeLog("TRANSLATION RESULT", translated)
|
|
return nil
|
|
}
|