flashsync / ocr_service.gleam
Dhurgh's picture
Permanently remove build artifacts from history
d0b8e8f
Raw
History Blame Contribute Delete
4.32 kB
import gleam/http/request
import gleam/http.{Post}
import gleam/float
pub type OcrProvider {
GoogleVision
AzureComputerVision
TesseractOcr
}
pub type HandwritingData {
HandwritingData(
image_base64: String,
confidence: Float,
extracted_text: String,
bounding_boxes: List(BoundingBox),
)
}
pub type BoundingBox {
BoundingBox(
text: String,
x: Int,
y: Int,
width: Int,
height: Int,
)
}
pub type OcrResult {
OcrSuccess(text: String, confidence: Float, metadata: OcrMetadata)
OcrPartial(text: String, confidence: Float, errors: List(String))
OcrFailed(reason: String)
}
pub type OcrMetadata {
OcrMetadata(
language: String,
character_count: Int,
word_count: Int,
confidence_per_line: List(Float),
)
}
pub fn build_ocr_request(
_image_base64: String,
provider: OcrProvider,
api_key: String,
) -> request.Request(String) {
case provider {
GoogleVision ->
request.new()
|> request.set_method(Post)
|> request.prepend_header("Authorization", "Bearer " <> api_key)
|> request.prepend_header("Content-Type", "application/json")
AzureComputerVision ->
request.new()
|> request.set_method(Post)
|> request.prepend_header("Ocp-Apim-Subscription-Key", api_key)
|> request.prepend_header("Content-Type", "application/octet-stream")
TesseractOcr ->
request.new()
|> request.set_method(Post)
|> request.prepend_header("Content-Type", "application/json")
}
}
pub fn build_ocr_payload(image_base64: String) -> String {
"{\"requests\": [{\"image\": {\"content\": \"" <>
image_base64 <>
"\"}, \"features\": [{\"type\": \"TEXT_DETECTION\"}]}]}"
}
pub fn process_handwriting(data: HandwritingData) -> OcrResult {
// Simulate OCR processing
case data.confidence {
c if c >. 0.8 ->
OcrSuccess(
text: data.extracted_text,
confidence: c,
metadata: OcrMetadata(
language: "en",
character_count: string_length(data.extracted_text),
word_count: count_words(data.extracted_text),
confidence_per_line: [],
),
)
c if c >. 0.5 ->
OcrPartial(
text: data.extracted_text,
confidence: c,
errors: ["Some words may be incorrectly recognized"],
)
_ ->
OcrFailed(reason: "Handwriting confidence too low")
}
}
pub fn extract_searchable_text(data: HandwritingData) -> String {
// Clean and normalize extracted text for search indexing
normalize_text(data.extracted_text)
}
fn normalize_text(text: String) -> String {
// Remove extra whitespace and normalize
text
}
pub fn create_searchable_index(_text: String) -> List(String) {
// Split text into searchable tokens
[]
}
pub fn detect_text_languages(_text: String) -> List(#(String, Float)) {
// Language detection
[#("en", 0.95)]
}
pub fn improve_ocr_accuracy(
original: String,
_confidence: Float,
) -> String {
// Use contextual information to fix OCR errors
original
}
pub fn batch_process_sketches(_sketches: List(String)) -> List(OcrResult) {
[]
}
pub fn extract_mathematical_equations(_text: String) -> List(String) {
// Find and extract LaTeX or mathematical notation
[]
}
pub fn format_ocr_output(result: OcrResult) -> String {
case result {
OcrSuccess(text, conf, _) ->
"<div class='ocr-result'><p>" <>
text <>
"</p><p class='confidence'>Confidence: " <>
float.to_string(conf) <>
"%</p></div>"
OcrPartial(text, _conf, _errors) ->
"<div class='ocr-partial'><p>" <>
text <>
"</p><p>⚠️ Some words may need review</p></div>"
OcrFailed(reason) ->
"<div class='ocr-error'><p>OCR Failed: " <>
reason <>
"</p></div>"
}
}
pub fn create_drawing_to_text_pipeline(
sketch_image: String,
provider: OcrProvider,
api_key: String,
) -> OcrResult {
let _request = build_ocr_request(sketch_image, provider, api_key)
// In a real implementation, would make HTTP request and parse response
OcrSuccess(
text: "",
confidence: 0.0,
metadata: OcrMetadata(
language: "en",
character_count: 0,
word_count: 0,
confidence_per_line: [],
),
)
}
fn string_length(_s: String) -> Int {
0
}
fn count_words(_s: String) -> Int {
0
}