ホームページ > バックエンド開発 > Python チュートリアル > Streamlit と AWS Translator を使用したドキュメント翻訳サービス

Streamlit と AWS Translator を使用したドキュメント翻訳サービス

Barbara Streisand
リリース: 2025-01-01 02:35:09
オリジナル
269 人が閲覧しました

導入:

DocuTranslator は、AWS に組み込まれ、Streamlit アプリケーション フレームワークによって開発されたドキュメント翻訳システムです。このアプリケーションを使用すると、エンド ユーザーはアップロードしたいドキュメントを好みの言語に翻訳できます。ユーザーの希望に応じて複数の言語に翻訳できるため、ユーザーが快適な方法でコンテンツを理解するのに非常に役立ちます。

背景:

このプロジェクトの目的は、ユーザーが期待するとおりシンプルな翻訳プロセスを実現する、ユーザーフレンドリーでシンプルなアプリケーションインターフェイスを提供することです。このシステムでは、誰も AWS Translate サービスに入力してドキュメントを翻訳する必要はなく、エンドユーザーがアプリケーションのエンドポイントに直接アクセスして要件を満たすことができます。

高レベルのアーキテクチャ図:

Document Translation Service using Streamlit & AWS Translator

これはどのように作動しますか:

  • エンド ユーザーは、アプリケーション ロード バランサーを介してアプリケーションにアクセスできます。
  • アプリケーションインターフェイスが開いたら、ユーザーは翻訳に必要なファイルと翻訳先の言語をアップロードします。
  • これらの詳細を送信すると、ファイルは前述のソース S3 バケットにアップロードされ、ラムダ関数がトリガーされて AWS Translator サービスに接続されます。
  • 翻訳されたドキュメントの準備が完了すると、宛先の S3 バケットにアップロードされます。
  • その後、エンド ユーザーは Streamlit アプリケーション ポータルから翻訳されたドキュメントをダウンロードできます。

技術アーキテクチャ:

Document Translation Service using Streamlit & AWS Translator

上記のアーキテクチャは以下の重要なポイントを示しています -

  • アプリケーション コードはコンテナ化され、ECR リポジトリに保存されています。
  • 上記の設計に従って、ECR リポジトリからアプリケーション イメージをプルする 2 つのタスクをインスタンス化する ECS クラスターがセットアップされました。
  • 両方のタスクは、起動タイプとして EC2 上で起動されます。どちらの EC2 も、us-east-1a および us-east-1b アベイラビリティ ゾーンのプライベート サブネットで起動されます。
  • EFS ファイル システムは、2 つの基盤となる EC2 インスタンス間でアプリケーション コードを共有するために作成されます。 2 つのマウントポイントが 2 つのアベイラビリティーゾーン (us-east-1a および us-east-1b) に作成されます。
  • プライベート サブネットの前に 2 つのパブリック サブネットが構成され、us-east-1a アベイラビリティ ゾーンのパブリック サブネットに NAT ゲートウェイがセットアップされます。
  • アプリケーション ロード バランサーは、アプリケーション ロード バランサー セキュリティ グループ (ALB SG) のポート 80 で 2 つのパブリック サブネット全体にトラフィックを分散するプライベート サブネットの前に構成されています。
  • 2 つの EC2 インスタンスは、アプリケーション ロード バランサーからのトラフィックを 16347 ポートで受け入れる同じ EC2 セキュリティ グループ (Streamlit_SG) を持つ 2 つの異なるターゲット グループに構成されています。
  • EC2 インスタンスのポート 16347 と ECS コンテナのポート 8501 の間にポート マッピングが設定されています。トラフィックが EC2 セキュリティ グループのポート 16347 に到達すると、ECS コンテナ レベルで 8501 ポートにリダイレクトされます。

データはどのように保存されますか?

ここでは、EFS 共有パスを使用して、基盤となる 2 つの EC2 インスタンス間で同じアプリケーション ファイルを共有しました。 EC2 インスタンス内にマウントポイント /streamlit_appfiles を作成し、EFS 共有でマウントしました。このアプローチは、2 つの異なるサーバー間で同じコンテンツを共有するのに役立ちます。その後、同じアプリケーション コンテンツをコンテナ作業ディレクトリ (/streamlit) にレプリケートすることを目的としています。そのためにバインド マウントを使用し、EC2 レベルでアプリケーション コードに加えられた変更がコンテナにもレプリケートされるようにしました。双方向レプリケーションを制限する必要があります。つまり、誰かがコンテナ内からコードを誤って変更した場合、そのコードは EC2 ホスト レベルにレプリケートされるべきではないため、コンテナ内では作業ディレクトリが読み取り専用ファイルシステムとして作成されます。

Document Translation Service using Streamlit & AWS Translator

ECS コンテナの構成とボリューム:

基礎となる EC2 構成:
インスタンスタイプ: t2.medium
ネットワークの種類: プライベート サブネット

コンテナ構成:
画像:
ネットワークモード: デフォルト
ホストポート: 16347
コンテナポート: 8501
タスク CPU: 2 vCPU (2048 ユニット)
タスクメモリ: 2.5 GB (2560 MiB)

Document Translation Service using Streamlit & AWS Translator

ボリューム構成:
ボリューム名: streamlit-volume
ソースパス: /streamlit_appfiles
コンテナパス: /streamlit
読み取り専用ファイルシステム: はい

Document Translation Service using Streamlit & AWS Translator

タスク定義リファレンス:

{
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:<account-id>:task-definition/Streamlit_TDF-1:5",
    "containerDefinitions": [
        {
            "name": "streamlit",
            "image": "<account-id>.dkr.ecr.us-east-1.amazonaws.com/anirban:latest",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "streamlit-8501-tcp",
                    "containerPort": 8501,
                    "hostPort": 16347,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [
                {
                    "sourceVolume": "streamlit-volume",
                    "containerPath": "/streamlit",
                    "readOnly": true
                }
            ],
            "volumesFrom": [],
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/Streamlit_TDF-1",
                    "mode": "non-blocking",
                    "awslogs-create-group": "true",
                    "max-buffer-size": "25m",
                    "awslogs-region": "us-east-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "family": "Streamlit_TDF-1",
    "taskRoleArn": "arn:aws:iam::<account-id>:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::<account-id>:role/ecsTaskExecutionRole",
    "revision": 5,
    "volumes": [
        {
            "name": "streamlit-volume",
            "host": {
                "sourcePath": "/streamlit_appfiles"
            }
        }
    ],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "ecs.capability.execution-role-awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.ecr-auth"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.28"
        },
        {
            "name": "com.amazonaws.ecs.capability.task-iam-role"
        },
        {
            "name": "ecs.capability.execution-role-ecr-pull"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2"
    ],
    "requiresCompatibilities": [
        "EC2"
    ],
    "cpu": "2048",
    "memory": "2560",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "registeredAt": "2024-11-09T05:59:47.534Z",
    "registeredBy": "arn:aws:iam::<account-id>:root",
    "tags": []
}
ログイン後にコピー
ログイン後にコピー

Document Translation Service using Streamlit & AWS Translator

アプリケーションコードの開発とDockerイメージの作成:

app.py

import streamlit as st
import boto3
import os
import time
from pathlib import Path

s3 = boto3.client('s3', region_name='us-east-1')
tran = boto3.client('translate', region_name='us-east-1')
lam = boto3.client('lambda', region_name='us-east-1')


# Function to list S3 buckets
def listbuckets():
    list_bucket = s3.list_buckets()
    bucket_name = tuple([it["Name"] for it in list_bucket["Buckets"]])
    return bucket_name

# Upload object to S3 bucket
def upload_to_s3bucket(file_path, selected_bucket, file_name):
    s3.upload_file(file_path, selected_bucket, file_name)

def list_language():
    response = tran.list_languages()
    list_of_langs = [i["LanguageName"] for i in response["Languages"]]
    return list_of_langs

def wait_for_s3obj(dest_selected_bucket, file_name):
    while True:
        try:
            get_obj = s3.get_object(Bucket=dest_selected_bucket, Key=f'Translated-{file_name}.txt')
            obj_exist = 'true' if get_obj['Body'] else 'false'
            return obj_exist
        except s3.exceptions.ClientError as e:
            if e.response['Error']['Code'] == "404":
                print(f"File '{file_name}' not found. Checking again in 3 seconds...")
                time.sleep(3)

def download(dest_selected_bucket, file_name, file_path):
     s3.download_file(dest_selected_bucket,f'Translated-{file_name}.txt', f'{file_path}/download/Translated-{file_name}.txt')
     with open(f"{file_path}/download/Translated-{file_name}.txt", "r") as file:
       st.download_button(
             label="Download",
             data=file,
             file_name=f"{file_name}.txt"
       )

def streamlit_application():
    # Give a header
    st.header("Document Translator", divider=True)
    # Widgets to upload a file
    uploaded_files = st.file_uploader("Choose a PDF file", accept_multiple_files=True, type="pdf")
    # # upload a file
    file_name = uploaded_files[0].name.replace(' ', '_') if uploaded_files else None
    # Folder path
    file_path = '/tmp'
    # Select the bucket from drop down
    selected_bucket = st.selectbox("Choose the S3 Bucket to upload file :", listbuckets())
    dest_selected_bucket = st.selectbox("Choose the S3 Bucket to download file :", listbuckets())
    selected_language = st.selectbox("Choose the Language :", list_language())
    # Create a button
    click = st.button("Upload", type="primary")
    if click == True:
        if file_name:
            with open(f'{file_path}/{file_name}', mode='wb') as w:
                w.write(uploaded_files[0].getvalue())
        # Set the selected language to the environment variable of lambda function
        lambda_env1 = lam.update_function_configuration(FunctionName='TriggerFunctionFromS3', Environment={'Variables': {'UserInputLanguage': selected_language, 'DestinationBucket': dest_selected_bucket, 'TranslatedFileName': file_name}})
        # Upload the file to S3 bucket:
        upload_to_s3bucket(f'{file_path}/{file_name}', selected_bucket, file_name)
        if s3.get_object(Bucket=selected_bucket, Key=file_name):
            st.success("File uploaded successfully", icon="✅")
            output = wait_for_s3obj(dest_selected_bucket, file_name)
            if output:
              download(dest_selected_bucket, file_name, file_path)
        else:
            st.error("File upload failed", icon="?")


streamlit_application()
ログイン後にコピー
ログイン後にコピー

about.py

import streamlit as st

## Write the description of application
st.header("About")
about = '''
Welcome to the File Uploader Application!

This application is designed to make uploading PDF documents simple and efficient. With just a few clicks, users can upload their documents securely to an Amazon S3 bucket for storage. Here’s a quick overview
of what this app does:

**Key Features:**
- **Easy Upload:** Users can quickly upload PDF documents by selecting the file and clicking the 'Upload' button.
- **Seamless Integration with AWS S3:** Once the document is uploaded, it is stored securely in a designated S3 bucket, ensuring reliable and scalable cloud storage.
- **User-Friendly Interface:** Built using Streamlit, the interface is clean, intuitive, and accessible to all users, making the uploading process straightforward.

**How it Works:**
1. **Select a PDF Document:** Users can browse and select any PDF document from their local system.
2. **Upload the Document:** Clicking the ‘Upload’ button triggers the process of securely uploading the selected document to an AWS S3 bucket.
3. **Success Notification:** After a successful upload, users will receive a confirmation message that their document has been stored in the cloud.
This application offers a streamlined way to store documents on the cloud, reducing the hassle of manual file management. Whether you're an individual or a business, this tool helps you organize and store your
 files with ease and security.
You can further customize this page by adding technical details, usage guidelines, or security measures as per your application's specifications.'''

st.markdown(about)
ログイン後にコピー
ログイン後にコピー

navigation.py

import streamlit as st

pg = st.navigation([
    st.Page("app.py", title="DocuTranslator", icon="?"),
    st.Page("about.py", title="About", icon="?")
], position="sidebar")

pg.run()
ログイン後にコピー

Dockerfile:

FROM python:3.9-slim
WORKDIR /streamlit
COPY requirements.txt /streamlit/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
RUN mkdir /tmp/download
COPY . /streamlit
EXPOSE 8501
CMD ["streamlit", "run", "navigation.py", "--server.port=8501", "--server.headless=true"]
ログイン後にコピー

Docker ファイルは、上記のアプリケーション構成ファイルをすべてパッケージ化してイメージを作成し、ECR リポジトリにプッシュされます。 Docker Hub を使用してイメージを保存することもできます。

ロードバランシング

このアーキテクチャでは、アプリケーション インスタンスはプライベート サブネットに作成され、ロード バランサーはプライベート EC2 インスタンスへの受信トラフィックの負荷を軽減するために作成されることになっています。
コンテナをホストするために使用できる基盤となる EC2 ホストが 2 つあるため、受信トラフィックを分散するために 2 つの EC2 ホスト間でロード バランシングが構成されます。 2 つの異なるターゲット グループが作成され、それぞれに 2 つの EC2 インスタンスが 50% の重みで配置されます。

ロードバランサーは、ポート 80 で受信トラフィックを受け入れ、ポート 16347 でバックエンド EC2 インスタンスに渡し、それは対応する ECS コンテナにも渡されます。

Document Translation Service using Streamlit & AWS Translator

Document Translation Service using Streamlit & AWS Translator

ラムダ関数:

ソースバケットを入力として受け取り、そこから PDF ファイルをダウンロードしてコンテンツを抽出するように構成されたラムダ関数があり、コンテンツを現在の言語からユーザーが指定したターゲット言語に翻訳し、宛先 S3 にアップロードするテキスト ファイルを作成します。バケツ。

{
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:<account-id>:task-definition/Streamlit_TDF-1:5",
    "containerDefinitions": [
        {
            "name": "streamlit",
            "image": "<account-id>.dkr.ecr.us-east-1.amazonaws.com/anirban:latest",
            "cpu": 0,
            "portMappings": [
                {
                    "name": "streamlit-8501-tcp",
                    "containerPort": 8501,
                    "hostPort": 16347,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [],
            "environmentFiles": [],
            "mountPoints": [
                {
                    "sourceVolume": "streamlit-volume",
                    "containerPath": "/streamlit",
                    "readOnly": true
                }
            ],
            "volumesFrom": [],
            "ulimits": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "/ecs/Streamlit_TDF-1",
                    "mode": "non-blocking",
                    "awslogs-create-group": "true",
                    "max-buffer-size": "25m",
                    "awslogs-region": "us-east-1",
                    "awslogs-stream-prefix": "ecs"
                },
                "secretOptions": []
            },
            "systemControls": []
        }
    ],
    "family": "Streamlit_TDF-1",
    "taskRoleArn": "arn:aws:iam::<account-id>:role/ecsTaskExecutionRole",
    "executionRoleArn": "arn:aws:iam::<account-id>:role/ecsTaskExecutionRole",
    "revision": 5,
    "volumes": [
        {
            "name": "streamlit-volume",
            "host": {
                "sourcePath": "/streamlit_appfiles"
            }
        }
    ],
    "status": "ACTIVE",
    "requiresAttributes": [
        {
            "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
        },
        {
            "name": "ecs.capability.execution-role-awslogs"
        },
        {
            "name": "com.amazonaws.ecs.capability.ecr-auth"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.28"
        },
        {
            "name": "com.amazonaws.ecs.capability.task-iam-role"
        },
        {
            "name": "ecs.capability.execution-role-ecr-pull"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
        },
        {
            "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
        }
    ],
    "placementConstraints": [],
    "compatibilities": [
        "EC2"
    ],
    "requiresCompatibilities": [
        "EC2"
    ],
    "cpu": "2048",
    "memory": "2560",
    "runtimePlatform": {
        "cpuArchitecture": "X86_64",
        "operatingSystemFamily": "LINUX"
    },
    "registeredAt": "2024-11-09T05:59:47.534Z",
    "registeredBy": "arn:aws:iam::<account-id>:root",
    "tags": []
}
ログイン後にコピー
ログイン後にコピー

アプリケーションのテスト:

アプリケーション ロード バランサーの URL「ALB-747339710.us-east-1.elb.amazonaws.com」を開いて、Web アプリケーションを開きます。任意の PDF ファイルを参照し、ソース "fileuploadbucket-hwirio984092jjs" と宛先バケット "transratedfileuploadbucket-kh939809kjkfjsekfl" の両方をそのままにしておきます。ラムダ コードではターゲットがハードコーディングされているためです。バケットは上記の通りです。ドキュメントを翻訳する言語を選択し、アップロードをクリックします。クリックすると、アプリケーション プログラムは宛先 S3 バケットのポーリングを開始し、翻訳されたファイルがアップロードされているかどうかを確認します。正確なファイルが見つかった場合は、宛先 S3 バケットからファイルをダウンロードするための新しいオプション「ダウンロード」が表示されます。

アプリケーションリンク: http://alb-747339710.us-east-1.elb.amazonaws.com/

Document Translation Service using Streamlit & AWS Translator

実際のコンテンツ:

import streamlit as st
import boto3
import os
import time
from pathlib import Path

s3 = boto3.client('s3', region_name='us-east-1')
tran = boto3.client('translate', region_name='us-east-1')
lam = boto3.client('lambda', region_name='us-east-1')


# Function to list S3 buckets
def listbuckets():
    list_bucket = s3.list_buckets()
    bucket_name = tuple([it["Name"] for it in list_bucket["Buckets"]])
    return bucket_name

# Upload object to S3 bucket
def upload_to_s3bucket(file_path, selected_bucket, file_name):
    s3.upload_file(file_path, selected_bucket, file_name)

def list_language():
    response = tran.list_languages()
    list_of_langs = [i["LanguageName"] for i in response["Languages"]]
    return list_of_langs

def wait_for_s3obj(dest_selected_bucket, file_name):
    while True:
        try:
            get_obj = s3.get_object(Bucket=dest_selected_bucket, Key=f'Translated-{file_name}.txt')
            obj_exist = 'true' if get_obj['Body'] else 'false'
            return obj_exist
        except s3.exceptions.ClientError as e:
            if e.response['Error']['Code'] == "404":
                print(f"File '{file_name}' not found. Checking again in 3 seconds...")
                time.sleep(3)

def download(dest_selected_bucket, file_name, file_path):
     s3.download_file(dest_selected_bucket,f'Translated-{file_name}.txt', f'{file_path}/download/Translated-{file_name}.txt')
     with open(f"{file_path}/download/Translated-{file_name}.txt", "r") as file:
       st.download_button(
             label="Download",
             data=file,
             file_name=f"{file_name}.txt"
       )

def streamlit_application():
    # Give a header
    st.header("Document Translator", divider=True)
    # Widgets to upload a file
    uploaded_files = st.file_uploader("Choose a PDF file", accept_multiple_files=True, type="pdf")
    # # upload a file
    file_name = uploaded_files[0].name.replace(' ', '_') if uploaded_files else None
    # Folder path
    file_path = '/tmp'
    # Select the bucket from drop down
    selected_bucket = st.selectbox("Choose the S3 Bucket to upload file :", listbuckets())
    dest_selected_bucket = st.selectbox("Choose the S3 Bucket to download file :", listbuckets())
    selected_language = st.selectbox("Choose the Language :", list_language())
    # Create a button
    click = st.button("Upload", type="primary")
    if click == True:
        if file_name:
            with open(f'{file_path}/{file_name}', mode='wb') as w:
                w.write(uploaded_files[0].getvalue())
        # Set the selected language to the environment variable of lambda function
        lambda_env1 = lam.update_function_configuration(FunctionName='TriggerFunctionFromS3', Environment={'Variables': {'UserInputLanguage': selected_language, 'DestinationBucket': dest_selected_bucket, 'TranslatedFileName': file_name}})
        # Upload the file to S3 bucket:
        upload_to_s3bucket(f'{file_path}/{file_name}', selected_bucket, file_name)
        if s3.get_object(Bucket=selected_bucket, Key=file_name):
            st.success("File uploaded successfully", icon="✅")
            output = wait_for_s3obj(dest_selected_bucket, file_name)
            if output:
              download(dest_selected_bucket, file_name, file_path)
        else:
            st.error("File upload failed", icon="?")


streamlit_application()
ログイン後にコピー
ログイン後にコピー

翻訳されたコンテンツ (カナダフランス語)

import streamlit as st

## Write the description of application
st.header("About")
about = '''
Welcome to the File Uploader Application!

This application is designed to make uploading PDF documents simple and efficient. With just a few clicks, users can upload their documents securely to an Amazon S3 bucket for storage. Here’s a quick overview
of what this app does:

**Key Features:**
- **Easy Upload:** Users can quickly upload PDF documents by selecting the file and clicking the 'Upload' button.
- **Seamless Integration with AWS S3:** Once the document is uploaded, it is stored securely in a designated S3 bucket, ensuring reliable and scalable cloud storage.
- **User-Friendly Interface:** Built using Streamlit, the interface is clean, intuitive, and accessible to all users, making the uploading process straightforward.

**How it Works:**
1. **Select a PDF Document:** Users can browse and select any PDF document from their local system.
2. **Upload the Document:** Clicking the ‘Upload’ button triggers the process of securely uploading the selected document to an AWS S3 bucket.
3. **Success Notification:** After a successful upload, users will receive a confirmation message that their document has been stored in the cloud.
This application offers a streamlined way to store documents on the cloud, reducing the hassle of manual file management. Whether you're an individual or a business, this tool helps you organize and store your
 files with ease and security.
You can further customize this page by adding technical details, usage guidelines, or security measures as per your application's specifications.'''

st.markdown(about)
ログイン後にコピー
ログイン後にコピー

結論:

この記事では、エンドユーザーがいくつかのオプションをクリックして必要な情報を選択し、構成を気にせずに数秒以内に目的の出力を取得する必要がある文書翻訳プロセスが、私たちが想像するほど簡単であることを示しました。現時点では、PDF ドキュメントを翻訳する単一の機能を組み込みましたが、後でこれについてさらに研究し、いくつかの興味深い機能を備えた単一のアプリケーションで多機能を実現する予定です。

以上がStreamlit と AWS Translator を使用したドキュメント翻訳サービスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート