Slide 1

Slide 1 text

OpenAI/Gemini APIを使って EPUBを翻訳するCLIツールをつ くってみた 2024/07/19 面白法人カヤックさん クラシコム合同勉強会 tomiyan

Slide 2

Slide 2 text

アジェンダ - 自己紹介 - なぜ作り始めたのか - EPUBのデータ構造 - OpenAI APIとの格闘 - Gemini API - 今後

Slide 3

Slide 3 text

自己紹介 tomiyan / 冨田昌邦 Webエンジニア、情シスも兼務 略歴 - サレジオ高専 情報工学科 - SIer 6.5年 - SES 0.5年 - 不動産ポータル 11.5年 - クラシコム 4年

Slide 4

Slide 4 text

なぜ作り始めたのか

Slide 5

Slide 5 text

なぜ作り始めたのか - 前職時代からRustいいよと聞いていた - 個人的なプログラミング言語の選定要件 - AWSなどからSDKが提供される - DBクライアントが提供される - 2023/11にAWS SDK for RustがGA - そろそろプロダクションへの利用もありかなと思った

Slide 6

Slide 6 text

なぜ作り始めたのか - The Rust Programming Language 日本語版 - The Rust Programming Language 日本語版 (rust-jp.rs) を半分くらい履修 - Rust Web Development読みたいけど、まだ訳書がない

Slide 7

Slide 7 text

なぜ作り始めたのか - ChatGPTにPDFをアップロードすると翻訳することができる - 単なるテキストとして部分的に返してくる - EPUBの翻訳頼んだら、翻訳するためのPythonのコードを渡された

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

なぜ作り始めたのか - EPUBを翻訳してくれるツールないかなと検索したところ DeepL APIで翻訳してくれるCLI sharplab/epub-translator: An utility to translate epub books with DeepL (github.com) が公開されていた - Red Hatの @shiroica さんが作っている - KotlinとQuarkusで実装されている - GraalVMに対応しているのでNativeImageも作れる - 現状Jarで提供されている

Slide 10

Slide 10 text

なぜ作り始めたのか - インスパイアされた - この際、RustとOpenAI APIも勉強できて一石二鳥じゃないか

Slide 11

Slide 11 text

EPUBのデータ構造

Slide 12

Slide 12 text

EPUBのデータ構造 - https://idpf.org/epub/30/spec/epub30-ocf.html - XML、XHTML、HTMLやCSS、画像などをzipで固めたもの 引用:太宰治 走れメロス 青空文庫をネット書房が組版・製本したEPUB

Slide 13

Slide 13 text

EPUBのデータ構造 - HTMLのテキストノードを翻訳すれば置き換えることができる - 日本語などのドキュメントはがはさまっており、ルビを生かしたまま 翻訳できない 引用:太宰治 走れメロス 青空文庫をネット書房が組版・製本したEPUB

Slide 14

Slide 14 text

EPUBのデータ構造 - 当初原文のままがよさそうな
などをリス
トアップして、翻訳をスキップしようとした
- 出版社によりマークアップの仕方が違うためリストアップが困難だった
- 大抵の書籍は

内のテキストノードさえ翻訳してあげれば良さそ うなことがわかった

Slide 15

Slide 15 text

OpenAI APIとの格闘

Slide 16

Slide 16 text

OpenAI APIとの格闘 - Rate limits - 利用者の課金額や初回課金成功日数によってTiersが分かれている

Slide 17

Slide 17 text

OpenAI APIとの格闘 - Tiers、MODEL(gtp-4o,gtp-4turbo,gtp-3.5-turboなど)によって1分毎のリクエスト 数やトークン数上限が決まっている

Slide 18

Slide 18 text

OpenAI APIとの格闘 - レスポンスヘッダでレートリミットがいつ回復するか返してくれる

Slide 19

Slide 19 text

OpenAI APIとの格闘 - APIのレスポンスがそれほどはやくないのでできればある程度まとまった行数を並 行してリクエストしたい - まとめ過ぎるとトークン数の上限に達してしまう - 翻訳の場合、入力・出力の文字数が多くトークンを消費しやすい - リクエスト数よりもトークン数の上限にひっかかりやすい - レスポンスヘッダの`x-ratelimit-reset-tokens`をパースしてsleepを入れた

Slide 20

Slide 20 text

OpenAI APIとの格闘 - レイアウトが崩れてしまうので、原文のテキストノードのあとに訳文を追加したい - 原文1段落に対して必ず1段落の訳文を返してほしい

Slide 21

Slide 21 text

APIの結果ではないけど 雰囲気を味わってもらうための例

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

OpenAI APIとの格闘 - 実際には20段落事に翻訳している - 10回に1回くらいの頻度で原文と訳文の数の不一致が発生する - 不一致の場合は1段落ずつ翻訳するようにフォールバックしている

Slide 25

Slide 25 text

Gemini API

Slide 26

Slide 26 text

Gemini API - 素直な良い子 - OpenAI APIよりもはやい - トークン調査用のAPIもある - レートリミットの情報がわからない

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

注意 - 翻訳されている本がでているのであれば、そちらを購入することを強くおすすめしま す - あくまでも翻訳されていない本を読む補助のツールです - 翻訳に時間がかかるし、APIの課金額が読めない - ルビを除去したりしていますし、文中の画像やソースコード内のコメントは翻訳でき ない - 将来的にOS、EPUBリーダー、AIプラットフォーマーが対応しそうな気もする - DeepLも次世代LLMモデルを2024/07/17発表 - DeepLが翻訳でChatGPT-4、Google、Microsoftを上回る次世代 LLMモデルを実装

Slide 29

Slide 29 text

発展している最中なので価格もAPIの仕様も変わりやすい - 今朝(2024/07/19)もGPT-4o miniが発表 - DeepL API Pro $5.48 + 100万文字あたり$25 1M tokens Input Output GPT-4o $5 $15 GPT-4o mini $0.15 $0.6 GPT-3.5 Turbo $0.5 $1.5 Gemini 1.5 Flash $0.35 $1.05 Gemini 1.5 Pro $3.5 $10.5

Slide 30

Slide 30 text

今後

Slide 31

Slide 31 text

今後 - dry runしておおよその分量をわかるように - brew installできるようにする - Amazon BedrockのClaude3に対応 - リファクタ - Rustの本 翻訳したけどまだ読んでいない

Slide 32

Slide 32 text

おわり