Zenn
⛓️

【個人開発記録】翻訳APIを自作する【しりとり画像ジェネレーター】

2024/03/17に公開

開発進捗:画像生成機能の実装

オリアプ開発の進捗記録です。
ここ2日間で [画像生成機能] まで作りきりました。
(関連するフロントエンドの細かい調整・修正含めおよそ13時間くらい)
<アプリはこちら>

現状の進捗としては、ミニマムの機能は実装できたと思います。
まだ細かなバグ修正などはありますが、、、

画像生成機能を実装する上で想定外だった(設計が甘かった)のは画像生成のプロンプトを日本語で渡せないこと。

【閲覧注意】「イヌ→ぬいぐるみ」で生成した画像


こわいよぉぉぉぉぉ。。。。。
どんな画像が生成されるか楽しみにしてたのにーーーーー。。。。。
ここで日本語でプロンプトを渡しているせいでわけのわからない画像が生成されているということに気づきます。

これはGPTなど日本語に対応しているAPIを使えば日本語プロンプトでの実装を実現できたのでしょうが、トークンの制限(画像生成による従量課金)を気にしたくなかったので Stable Diffusion の無料APIを使うことにしたためです。

これらによりひらがなを英語に翻訳する必要が出てきたためここで、翻訳APIの導入が必須となり、有名どころの DeepL APIGoogle翻訳API の使用も検討しましたが、
こちらも無料枠が 500,000文字 までと制限があるので勉強も兼ねて翻訳APIを自作することにしました。
Stable Diffusion のAPI導入のトピックはまた別の記事で紹介するとして、
今回はGASで作成したプログラムを翻訳APIとして使用する方法を紹介したいと思います。

GAS(Google Apps Script)で翻訳APIを自作する

GASの LanguageApp クラスを使用して翻訳プログラムを作成しAPIとして使う。

【手順】

  1. 自身のマイドライブ(Googleドライブ)へアクセス
  2. Google Apps Scriptファイルを作成
手順図解

  1. 関数の作成
以下のコードをGASのエディタへ記述
main.gs
function doGet(e) {
  // リクエストパラメータの取得
  let p = e.parameter;
  // LanguageAppにて翻訳を実行
  let translatedText = LanguageApp.translate(p.text, p.source, p.target);
  // レスポンスボディの作成
  let body;
  if (translatedText) {
    body = {
      code: 200,
      text: translatedText
    };
  } else {
    body = {
      code: 400,
      text: "Faild Request"
    }
  }
  // レスポンスの作成
  let response = ContentService.createTextOutput();
  response.setMimeType(ContentService.MimeType.JSON);
  response.setContent(JSON.stringify(body));

  return response;
}
  1. APIとしてデプロイする
手順図解

①右上の[デプロイ][新しいデプロイ]をクリック


②アクセスできるユーザーで全員を選択


③ウェブアプリのURLをコピーする ← これをAPIのエンドポイントして扱う

これだけです。簡単ですね٩( ᐛ )و

RailsにAPIを組み込む

私はRailsを使用してアプリケーションを開発しているので以下はRailsでの導入手順例です。

  1. GemfileHTTParty をインストールする
Gemfile
gem 'httparty'
ターミナル
bundle install
  1. APIの呼び出しに関するロジックをサービスクラスとして定義する
    app/sevices/translation_service.rb ファイルを作成
translation_service.rb
require 'httparty'

class TranslationService
  API_URL = "(GASでコピーしたURLをペースト)https://..."
  
  def self.translate(words)
    query = { text: words, source: 'ja', target: 'en' }
    response = HTTParty.get(API_URL, query: query)
    if response.success?
      response.parsed_response["text"]
    else
      words # 翻訳に失敗した場合は元のテキストを返す
    end
  end
end
  1. コントローラーから呼び出す
samples_controller.rb
# 〜使用例〜
words = params[:words].join(", ") # => ["ねこ", "こぐま", "まじっく"]
translated_words = TranslationService.translate(words) # => Cat, Little Bear, Magic

GAS様様ですね٩( ᐛ )و

現場からは以上ですー

Discussion

ログインするとコメントできます