公開中サイト
開発環境
Server | lightSail |
Language | Python3.11 |
Framework | Django |
DB | sqlite3 |
ローカル環境ではPythonのvenvを使用。エディタはvs codeです。
ChatGPT
洋楽の歌詞の翻訳を整理して和訳してくれるアプリが欲しいと思って作成した。最初はChatGPTのAPIに洋楽の歌詞を入れてみたが、tempatureを0にすれば、毎回同じ翻訳を返してくれるが、プロンプトの内容のせいか出力データに安定性がなかった。ある歌詞は問題なく指示通りに返してくれるが、違う歌詞だと変な回答になって戻ってくる。おそらく英語歌詞の内容を「ここから先は歌詞です」とプロンプトをいれても食べてしまうのだ。トークン数も上限があるので英語歌詞でトークン消費もしたくない。
何度かやってみて、ChatGPTは翻訳には向いていないという結論に達した。では普通の翻訳APIを使えばいいいと判断。GoogleとDeeplの2つが翻訳では有名なので、どっちかを使おうと。
Google Translate API
Googleの翻訳API「Google Translate API」は料金プランがわかりにくく 1hour / $45 とか書いてある。バカ高い。検索してみると古いGoogleのAPIなら無料で使えると出てくるので、ブログに掲載されていた古いヴァージョンをPYTHONにインストールして使用。結論からいうとNGだった。ヴァージョンが古いせいでHTTPXのバージョンを下げられると、他のライブラリがコンフリクトを起こしてHTTPXを新しくしろとエラーが出る。Googleの翻訳APIは料金プランがわかりにくいので使いたくない。Googleは平気で値段を上げたりするので個人開発では手を出しにくい。
Deepl
Deeplをみたところ、APIの使用料金がわかりやすく、500,000文字まで1月無料と書いてある。個人開発にはちょうどいい。クレジットカード登録しないといけないが50万文字オーバーで自動に有料プランに変わるわけでもない。使いたい放題にしても一月700円程度の安さ。pip install deepl してもコンフリクトは起こらない。翻訳精度も高いのでDeeplに決定。
実装
下記がDEEPLをつかったPYTHONのサンプルコード。
月間の上限があるので1回で翻訳できるのは2000文字に規定。原文と翻訳文を比較できるように、原文の次の行に翻訳文を出力。空行をいれて続きの文を出力というルール。
my app/views.py
cdef index(request):
API_KEY = os.environ['DEEPL_API_KEY']
trans_results = ""
if request.method == "POST":
form = ChatForm(request.POST)
if form.is_valid():
sentence = form.cleaned_data['sentence']
if len(sentence) < 2001:
def translate_text_with_deepl(text, auth_key):
translator = deepl.Translator(auth_key)
result = translator.translate_text(text, target_lang="JA")
return result.text
def get_translated_texts():
auth_key = API_KEY
original_texts = sentence
lines = original_texts.strip().split('\n')
translated_texts = []
for line in lines:
translated_line = translate_text_with_deepl(line, auth_key)
translated_texts.append(f'{line}\n{translated_line}\n')
return translated_texts
results = get_translated_texts()
for result in results:
trans_results += result + "\n"
else:
trans_results = '文字数オーバーです'
else:
form = ChatForm()
結果
試しにテイラースフィウトの「クルーエル・サマー」を翻訳させてみました。期待通りの結果が戻ってきました。
コードの開発など記述については説明しません。1年も経たないうちに有益な情報じゃなくなるので、公式マニュアルを参考にしてください。