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 }