본문 바로가기
서버 구축·실습

GCP Vision API로 이미지에서 텍스트 추출하고 번역하는 방법 (OCR 실습 완전 가이드)

by joe2026 2026. 3. 25.

이 글은 이미지 속 텍스트를 추출(OCR)하고 번역 및 의미 분석까지 연결하려는 클라우드 학습자를 위한 실습 기록입니다.
문제는 이미지에 있는 문자를 어떻게 추출하고, 그 결과를 번역하고, 마지막에는 의미 분석까지 이어가는 전체 흐름이 처음에는 잘 보이지 않는다는 점입니다.
이 글을 통해 Cloud Storage에 이미지를 올리고, Vision API로 텍스트를 추출한 뒤, Translation API와 Natural Language API까지 연결하는 전체 과정을 직접 따라할 수 있습니다.

이 글의 핵심 질문
GCP에서 이미지 텍스트를 추출하고 번역 및 분석까지 자동화하려면 어떻게 해야 하는가?


실습 환경

  • Cloud: Google Cloud Platform
  • 서비스: Cloud Storage, Vision API, Translation API, Natural Language API
  • 인증 방식: API Key
  • 입력 데이터: 프랑스어 간판 이미지 sign.jpg
  • 처리 흐름: 이미지 → OCR → 번역 → 엔티티 분석

아키텍처

이번 실습의 핵심 구조는 단순 OCR이 아닙니다. Cloud Storage에 저장된 이미지를 Vision API가 읽어서 텍스트를 추출하고, 그 결과를 Translation API가 영어로 번역한 뒤, Natural Language API가 사람, 장소 같은 엔티티를 식별하는 흐름입니다. 즉, 하나의 이미지가 데이터 파이프라인을 통과하면서 “읽을 수 있는 텍스트”와 “분석 가능한 의미 데이터”로 바뀌는 구조입니다.

Cloud Storage → Vision API OCR → Translation API → Natural Language API → Client / Application


전체 흐름

이번 실습은 크게 5단계로 진행됩니다.

  1. API Key 생성
  2. Cloud Storage 버킷 생성 및 이미지 업로드
  3. Vision API OCR 요청 생성 및 실행
  4. Translation API로 번역
  5. Natural Language API로 엔티티 분석

즉, 이 실습은 “API를 하나씩 따로 써보는 것”이 아니라 이미지 데이터를 텍스트와 의미 정보로 바꾸는 연속 처리 구조를 익히는 과정입니다.


■ 강사 설명

실습은 프랑스어가 적힌 간판 사진을 기준으로 진행됩니다. 먼저 Vision API의 TEXT_DETECTION 기능으로 이미지 안의 글자를 OCR로 추출하고, 그 결과를 Translation API로 영어로 번역합니다. 마지막으로 Natural Language API의 analyzeEntities 메서드로 번역된 문장에서 사람, 장소, 기타 엔티티를 추출합니다. :contentReference[oaicite:0]{index=0}

즉, 이번 실습의 핵심은 단순 OCR 정확도 확인이 아니라 OCR 결과를 후속 AI API에 넘겨 더 풍부한 정보로 확장하는 것입니다.


■ 내가 이해한 핵심

이번 실습의 본질은 아래 한 문장으로 정리됩니다.

이미지는 그냥 파일이 아니라, 텍스트와 의미를 꺼낼 수 있는 데이터 원천이다

Vision API는 이미지를 문자로 바꾸고, Translation API는 그 문자를 이해 가능한 언어로 바꾸고, Natural Language API는 그 문장에서 중요한 개체를 추출합니다. 즉, 이미지 하나가 여러 단계를 거치며 점점 더 분석 가능한 데이터로 변환됩니다.


■ 내가 실제로 겪은 문제

실습 초반에 가장 먼저 부딪힌 문제는 인증과 접근 권한이었습니다. Vision API를 curl로 호출하려면 API Key가 필요하고, Cloud Storage에 올린 이미지를 API가 읽을 수 있어야 합니다.

즉, 단순히 이미지를 업로드했다고 끝이 아니라 아래 두 가지가 같이 맞아야 합니다.

  • API Key가 생성되어 있어야 함
  • 이미지 객체가 읽을 수 있는 상태여야 함

이 경험을 통해 분명해졌습니다. AI API 실습은 모델보다 먼저 인증과 데이터 접근 경로를 정확히 맞추는 것이 핵심이라는 점입니다.


실습 단계

1단계. API Key 생성

목적: Vision API, Translation API, Natural Language API를 curl로 호출하기 위한 인증 키를 만드는 단계입니다.

GCP 콘솔에서 APIs & services > Credentials로 이동한 뒤, Create credentials > API key를 선택합니다. 키가 생성되면 값을 복사해 둡니다. 실습 문서는 이 키를 환경 변수에 저장해 매번 URL에 직접 쓰지 않도록 안내합니다. :contentReference[oaicite:1]{index=1}

export API_KEY=<YOUR_API_KEY>

이 단계가 중요한 이유는 이후 모든 curl 호출이 이 키를 통해 인증되기 때문입니다. 즉, API Key는 단순 문자열이 아니라 “이 요청이 어느 프로젝트의 권한으로 실행되는가”를 결정하는 출발점입니다.


2단계. Cloud Storage 버킷 생성

목적: OCR 대상 이미지를 저장할 클라우드 저장소를 만드는 단계입니다.

실습에서는 Vision API에 이미지를 보내는 두 가지 방법을 설명합니다. 하나는 base64 인코딩 문자열을 직접 보내는 방식이고, 다른 하나는 Cloud Storage에 저장된 파일의 URL을 넘기는 방식입니다. 이번 실습은 후자를 사용하므로 먼저 버킷을 생성합니다. GCP 콘솔에서 Cloud Storage > Browser로 이동한 뒤 Create bucket을 클릭합니다. :contentReference[oaicite:2]{index=2}

버킷 이름은 전역에서 유일해야 하므로 보통 프로젝트 ID 기반으로 지정합니다. 생성 과정에서는 Enforce public access prevention on this bucket 옵션을 해제하고, 이후 Permissions 탭에서 Access control을 Fine-grained로 바꾸라고 실습 문서가 안내합니다. :contentReference[oaicite:3]{index=3}

이 설정이 중요한 이유는 버킷 전체는 비공개로 유지하면서도, 특정 파일만 공개 Reader 권한을 줄 수 있게 하기 위해서입니다. 즉, “버킷은 보호하되 객체만 제한적으로 공개”하는 구조를 실습에서 의도적으로 경험하게 합니다.


3단계. sign.jpg 업로드 및 객체 공개 설정

목적: OCR 대상 이미지를 실제로 저장하고 Vision API가 접근할 수 있는 상태로 만드는 단계입니다.

실습 문서는 프랑스어 간판 사진을 sign.jpg라는 이름으로 저장한 뒤, 방금 만든 버킷의 Objects 탭에서 Upload files로 업로드하라고 안내합니다. 업로드가 끝나면 해당 파일 오른쪽 점 3개 메뉴에서 Edit Access를 선택합니다. 그 후 아래처럼 새 권한을 추가합니다.

  • Entity: Public
  • Name: allUsers
  • Access: Reader

저장하면 sign.jpg 파일은 공개 읽기 가능 상태가 됩니다. 실습 문서도 “버킷은 비공개로 유지하면서 파일만 공개”라고 설명합니다. :contentReference[oaicite:4]{index=4}

이 단계에서 중요한 점은 OCR 대상 이미지가 “존재”하는 것만으로는 충분하지 않다는 점입니다. API가 읽을 수 있는 경로와 권한이 함께 맞아야 합니다. 이 구조를 이해하지 못하면 이후 요청 JSON이 맞아도 API 호출이 실패할 수 있습니다.


4단계. Vision API OCR 요청 JSON 생성

목적: 어떤 이미지를 어떤 기능으로 분석할지 Vision API에 알려주는 단계입니다.

Cloud Shell에서 ocr-request.json 파일을 만들고, 아래 구조를 입력합니다. 이때 gcsImageUri에는 방금 올린 sign.jpg의 버킷 경로를 넣어야 합니다.

{
  "requests": [
    {
      "image": {
        "source": {
          "gcsImageUri": "gs://my-bucket-name/sign.jpg"
        }
      },
      "features": [
        {
          "type": "TEXT_DETECTION",
          "maxResults": 10
        }
      ]
    }
  ]
}

여기서 핵심은 type: TEXT_DETECTION입니다. 이것이 OCR 기능을 의미합니다. 실습 문서는 이 요청이 이미지에서 문자 블록과 단어들을 추출하는 optical character recognition을 수행한다고 설명합니다. :contentReference[oaicite:5]{index=5}

즉, 이 단계는 단순 JSON 작성이 아니라 “어떤 입력을 어떤 기능으로 처리할 것인가”를 API 스펙에 맞춰 정의하는 작업입니다.


5단계. Vision API 호출로 OCR 수행

목적: 실제 이미지를 읽어 텍스트를 추출하는 단계입니다.

Cloud Shell에서 아래 curl 명령을 실행합니다.

curl -s -X POST -H "Content-Type: application/json" --data-binary @ocr-request.json \
https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

응답에는 textAnnotations 배열이 포함되며, 첫 번째 객체에는 전체 텍스트 블록이 들어 있습니다. 실습 문서 예시에서는 아래와 비슷한 형태로 반환됩니다.

"locale": "fr",
"description": "LE BIEN PUBLIC
les dépeches
Pour Obama,
la moutarde
est
de Dijon"

즉, API는 단순히 문자만 읽는 것이 아니라 언어 코드(fr)와 함께 전체 문장 블록, 그리고 각 단어별 bounding box까지 제공합니다. 실습 문서도 첫 번째 textAnnotations 항목은 전체 텍스트 블록이며, 이후 항목들은 개별 단어와 위치 정보를 담는다고 설명합니다. :contentReference[oaicite:6]{index=6}

이제 OCR 결과를 다음 단계에서 다시 활용할 수 있도록 파일로 저장합니다.

curl -s -X POST -H "Content-Type: application/json" --data-binary @ocr-request.json \
https://vision.googleapis.com/v1/images:annotate?key=${API_KEY} -o ocr-response.json

이 단계의 핵심은 분명합니다. 이미지가 이제 텍스트 데이터로 바뀌었다는 점입니다.


6단계. Translation API 요청 생성 및 OCR 결과 번역

목적: 추출한 프랑스어 텍스트를 영어로 번역해 후속 분석이 가능하도록 만드는 단계입니다.

먼저 translation-request.json 파일을 아래처럼 만듭니다.

{
  "q": "your_text_here",
  "target": "en"
}

이제 OCR 결과 파일 ocr-response.json에서 텍스트 블록을 꺼내 이 파일에 넣어야 합니다. 실습 문서는 jq와 sed를 결합한 Bash 명령으로 이를 자동화합니다.

STR=$(jq .responses[0].textAnnotations[0].description ocr-response.json) && STR="${STR//\"}" && sed -i "s|your_text_here|$STR|g" translation-request.json

그 다음 Translation API를 호출합니다.

curl -s -X POST -H "Content-Type: application/json" --data-binary @translation-request.json \
https://translation.googleapis.com/language/translate/v2?key=${API_KEY} \
-o translation-response.json

응답 파일을 보면 아래와 같은 결과가 들어 있습니다.

{
  "data": {
    "translations": [
      {
        "translatedText": "THE PUBLIC GOOD the despatches For Obama, the mustard is from Dijon",
        "detectedSourceLanguage": "fr"
      }
    ]
  }
}

즉, OCR로 추출한 프랑스어가 영어로 변환되었고, 원본 언어가 fr이라는 것도 자동으로 감지됩니다. 실습 문서도 translatedText와 detectedSourceLanguage를 핵심 필드로 설명합니다. :contentReference[oaicite:7]{index=7}

이 단계는 다국어 데이터를 처리하는 데 매우 중요합니다. OCR만으로는 아직 사람이 모두 이해하기 어려울 수 있지만, 번역 이후에는 후속 NLP 분석이나 검색, 분류, 보고서 작성까지 훨씬 쉬워집니다.


7단계. Natural Language API로 엔티티 분석

목적: 번역된 텍스트에서 사람, 장소, 기타 핵심 개체를 추출하는 단계입니다.

먼저 nl-request.json 파일을 아래처럼 만듭니다.

{
  "document":{
    "type":"PLAIN_TEXT",
    "content":"your_text_here"
  },
  "encodingType":"UTF8"
}

이제 번역 결과에서 영어 문장을 추출해 content에 넣습니다. 실습 문서는 아래 Bash 명령을 사용합니다.

STR=$(jq .data.translations[0].translatedText translation-response.json) && STR="${STR//\"}" && sed -i "s|your_text_here|$STR|g" nl-request.json

그 다음 Natural Language API의 analyzeEntities 엔드포인트를 호출합니다.

curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}" \
-s -X POST -H "Content-Type: application/json" --data-binary @nl-request.json

응답에는 엔티티 목록이 들어 있으며, 예시로 아래와 같은 값이 보입니다.

  • Obama → PERSON
  • Dijon → LOCATION
  • mustard → OTHER

실습 문서는 엔티티별 salience(문맥상 중요도), mentions(텍스트 내 출현 위치), 위키피디아 URL과 같은 메타데이터도 함께 반환된다고 설명합니다. :contentReference[oaicite:8]{index=8}

이 단계의 의미는 아주 큽니다. 단순 OCR은 텍스트를 “읽는 것”에서 끝나지만, NLP 분석은 그 텍스트가 “무엇에 관한 것인지”를 구조화된 데이터로 바꿉니다. 즉, 이미지 한 장에서 사람명, 지명, 핵심 키워드를 추출해 검색, 분류, 요약, 추천 같은 후속 기능으로 확장할 수 있습니다.


실습 증거

1. Vision API OCR 응답

실습 문서의 OCR 응답 예시는 locale: "fr"와 함께 전체 텍스트 블록 LE BIEN PUBLIC ... de Dijon이 추출되는 모습을 보여줍니다. 이는 이미지가 텍스트 데이터로 성공적으로 변환되었음을 보여주는 핵심 증거입니다. :contentReference[oaicite:9]{index=9}

2. Translation API 응답

번역 응답 예시는 translatedText에 영어 문장이 들어 있고, detectedSourceLanguagefr로 반환됩니다. 이는 OCR 결과가 다국어 번역 파이프라인으로 정상 연결되었음을 보여줍니다. :contentReference[oaicite:10]{index=10}

3. Natural Language API 엔티티 분석

응답 예시에는 Obama가 PERSON, Dijon이 LOCATION으로 표시되고, 각 엔티티의 salience와 mentions 정보가 함께 포함됩니다. 이는 번역된 텍스트가 단순 문자열이 아니라 분석 가능한 의미 데이터로 바뀌었음을 보여주는 직접 증거입니다. :contentReference[oaicite:11]{index=11}


트러블슈팅

문제 증상:
Vision API 호출이 정상 동작하지 않거나 권한 관련 문제가 발생한다.

원인 분석:
API Key가 생성되지 않았거나, 환경 변수에 저장되지 않았거나, 요청 URL에 키가 빠졌을 수 있다.

확인 방법:
Credentials에서 API Key 생성 여부를 확인하고, Cloud Shell에서 echo $API_KEY로 환경 변수 값이 있는지 점검한다.

해결 방법:
API Key를 다시 생성한 뒤 export API_KEY=...로 저장하고, curl URL에 정확히 포함시킨다.

재발 방지 방법:
API 기반 실습에서는 본문 작업 전에 인증 변수부터 먼저 세팅하는 습관을 들인다.


문제 증상:
이미지는 업로드했는데 Vision API가 기대대로 읽지 못하거나 후속 호출이 실패한다.

원인 분석:
이미지 객체 권한이 공개 읽기 상태가 아니거나, gcsImageUri 경로가 잘못되었을 수 있다.

확인 방법:
Cloud Storage 객체의 Edit Access 설정에서 allUsers / Reader가 들어 있는지, JSON 요청의 버킷명이 실제와 일치하는지 확인한다.

해결 방법:
객체 수준에서 Public / allUsers / Reader 권한을 추가하고, gs://버킷명/sign.jpg 경로를 다시 확인한다.

재발 방지 방법:
버킷명, 객체명, 권한 설정을 OCR 요청 전에 먼저 점검하는 체크리스트를 만든다.


실무 핵심 포인트

이번 실습의 가장 중요한 교훈은 아래 한 문장으로 정리할 수 있습니다.

OCR은 끝이 아니라 시작이며, 번역과 NLP를 붙이면 이미지가 곧 분석 가능한 데이터 소스로 변한다

즉, 간판 사진, 영수증, 계약서, 제품 라벨, 메뉴판, 공문서 이미지처럼 사람이 눈으로만 읽던 정보도 API 체인 하나로 텍스트와 의미 데이터로 전환할 수 있습니다. 이 구조를 이해하면 대량 이미지 데이터 처리, 자동 분류, 검색 최적화, 글로벌 다국어 서비스까지 자연스럽게 확장할 수 있습니다.


결론

핵심 원칙
GCP에서 이미지 텍스트를 처리할 때는 Vision API만 보는 것이 아니라, Translation API와 Natural Language API까지 연결해 하나의 데이터 파이프라인으로 이해해야 한다.

실무 적용 시 주의점

  • API Key와 요청 URL을 먼저 정확히 설정할 것
  • Cloud Storage 객체 접근 권한을 점검할 것
  • OCR 결과를 바로 후속 API 입력으로 재사용하는 흐름을 익힐 것
  • 번역 이후 NLP 분석을 붙이면 데이터 가치가 크게 높아짐
  • 이미지 파일은 단순 파일이 아니라 추출 가능한 비정형 데이터 자산으로 볼 것

다음 학습 단계 제안
다음에는 영수증, 계약서, 메뉴판, 라벨 이미지 같은 실제 업무 데이터를 대상으로 OCR 자동화 파이프라인을 만들고, 그 결과를 BigQuery나 Looker Studio와 연결해보면 좋습니다.