🐥

GitHub Actions + OpenAI APIを使ったReadMeの自動翻訳対応

2025/01/19に公開

はじめに

デスクトップマスコットの OSSとして以下のプロジェクトを開発しています。こちらは誰も簡単にカスタマイズができるというものを考えて作っています。そのため開発者にも優しいリポジトリを目指しており、今回は ReadMeを多言語対応する部分について OpenAIを使って自動翻訳を行ったことについて記事にしました

https://github.com/MidraLab/uDesktopMascot

環境

  • GitHub Actions
  • python 3.11(actions内)
  • Open AI GPT-4o-mini

デモ

実際にどのようなjobのフローになっているのか、翻訳結果などはどうなっているのかは以下になります

ReadMeの更新差分が入ったコミットがPRされると自動的に翻訳処理が入ります

翻訳差分(例:中国語)は以下のようになります。実行する度に翻訳結果が変わるのは諦めました..

ここで行ったこと(要件)

  1. README.mdが更新されたときにほかの5言語のREADME_EN.md等を自動的に翻訳して、コミットしたい
  2. developブランチにREADME.mdの差分が入ったときは自動で実行して、が更新されたいないときはスキップする

翻訳処理について

翻訳処理には、現時点で一番価格が安いgpt-4o-miniをpythonで処理をしてその処理をactinos側で管理しています

pythonでの翻訳処理

from openai import OpenAI
import os

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

def translate_text(text, target_language):
    completion = client.chat.completions.create(
        model="gpt-4o-mini",  # 使用するモデルの指定
        messages=[
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": f"Translate the following text to {target_language}: {text}"}
        ]
    )
    # メッセージのコンテンツに直接アクセスする
    return completion.choices[0].message.content

def main():
    # Read the original README
    with open('README.md', 'r', encoding='utf-8') as file:
        original_text = file.read()

    # Translate to English
    translated_en = translate_text(original_text, 'English')
    with open('README_EN.md', 'w', encoding='utf-8') as file:
        file.write(translated_en)

    # Translate to Chinese
    translated_cn = translate_text(original_text, 'Chinese')
    with open('README_CN.md', 'w', encoding='utf-8') as file:
        file.write(translated_cn)

    # Translate to Spanish
    translated_es = translate_text(original_text, 'Spanish')
    with open('README_ES.md', 'w', encoding='utf-8') as file:
        file.write(translated_es)

    # Translate to French
    translated_fr = translate_text(original_text, 'French')
    with open('README_FR.md', 'w', encoding='utf-8') as file:
        file.write(translated_fr)

if __name__ == "__main__":
    main()

actionsの処理について

name: Translate README

on:
  pull_request:
    branches:
      - develop
    paths:
      - README.md

jobs:
  translate:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4.2.2

    - name: Set up Python
      uses: actions/setup-python@v5.3.0
      with:
        python-version: '3.11'

    - name: Install OpenAI library
      run: pip install openai

    - name: Run translation script
      env:
        OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
      run: python .github/scripts/translate_readme.py

    - name: Commit changes
      run: |
        git config --local user.email "action@github.com"
        git config --local user.name "GitHub Action"

        # 変更をステージしてコミット
        git add README_EN.md README_CN.md README_ES.md README_FR.md
        if git commit -m "Update translations"; then
          echo "Changes committed successfully."

          # Pullでリモートの最新の変更を取り込み、リベース
          if git pull --rebase origin ${{ github.head_ref }}; then
            echo "Successfully rebased."
          else
            echo "Rebase failed. Please review the errors."
            exit 1  # エラーが発生した場合、処理を中止
          fi

          # スタッシュが必要かを確認
          if git stash list | grep -q "stash@{0}"; then
            # スタッシュが存在する場合はポップする
            git stash pop
          fi

          # 最後にプッシュ
          git push origin HEAD:${{ github.head_ref }}
        else
          echo "No changes to commit"
        fi

最後に

LLMを使えばOSSの活動をよりグローバルに展開できる可能性があるので、みなさんもぜひ試してみてください!

MidraLab(ミドラボ)

Discussion