翻訳精度向上と改善
作成日: 2024年10月7日
使用モデル OpenAI 01 Mini by OpenAI01
作成日: 2024年10月7日
使用モデル OpenAI 01 Mini by OpenAI01
字幕の精度向上を模索
SRTファイルを処理し、翻訳後の字幕を動画に組み込むPythonスクリプトを改善中。改行機能の性能向上や、翻訳精度の更なる向上を目指す。
改善の提案
add_line_breaks
のパフォーマンス向上や翻訳精度向上のための最適化を提案中だよ。
以下では、add_line_breaks
関数のパフォーマンス向上と翻訳精度の改善方法について説明し、具体的なコードの改善案を提供します。
add_line_breaks
) の高性能化現状の課題:
add_line_breaks
関数では、Janome トークナイザーを使用してトークン化し、ループ内で正規表現を多用しています。これにより、特に大量の字幕データを処理する際にパフォーマンスが低下する可能性があります。改善案:
re.sub
を一度だけ使用し、不要な文字の除去を効率化します。改善後の add_line_breaks
関数:
def add_line_breaks(text): """テキストに適切な改行を追加します。 Args: text (str): 改行を追加するテキスト。 Returns: str: 改行が追加されたテキスト。 """ tokenizer = Tokenizer() tokens = tokenizer.tokenize(text, wakati=True) lines = [] current_line = "" punctuation = {'。', '!', '?'} for token in tokens: current_line += token if token in punctuation or len(current_line) >= MAX_LINE_LENGTH: lines.append(current_line) current_line = "" if current_line: lines.append(current_line) # 不要な文字の一括置換 cleaned_lines = [re.sub(r'[[]「」(){}‘’“”]', '', line) for line in lines] return '\n'.join(cleaned_lines[:MAX_LINES])
主な変更点:
現状の課題:
改善案:
改善後のプロンプトテンプレート:
template = """あなたはプロの翻訳者であり、字幕翻訳の専門家です。以下の点を厳守し、自然で正確な日本語に翻訳してください。 * 口語的な表現を適切に使用する * 文脈に合わせた適切な語彙を選択する * 字幕のニュアンスや感情を正確に伝える * 字幕のタイミングと長さを考慮し、簡潔かつ読みやすい表現にする * 前後の字幕の内容を考慮し、一貫性を保つ * 固有名詞や専門用語はそのまま、または適切に翻訳する * 翻訳後のテキストが自然で流暢な日本語になるように調整する 原文: {text} """
メモリ管理の改善:
ConversationBufferWindowMemory
の k
パラメータを調整し、適切なコンテキストを保持。改善後の translate_subtitles
関数:
async def translate_subtitles(subtitles): """字幕データを逐次的に翻訳し、メモリを更新します。 Args: subtitles (list): 翻訳する字幕データのリスト。 Returns: list: 翻訳された字幕データのリスト。 """ total_subtitles = len(subtitles) for idx, subtitle in enumerate(subtitles): # 現在の字幕をmemoryに追加(原文) memory.save_context({"text": subtitle.content}, {"response": ""}) # 翻訳を実行 result = await chain.apredict(text=subtitle.content) translated_text = result.strip() # 翻訳結果をsubtitleに設定 subtitle.content = translated_text # 翻訳結果をmemoryに追加(訳文) memory.save_context({"text": translated_text}, {"response": ""}) progress = (idx + 1) / total_subtitles * 100 print(f"Translation progress: {progress:.2f}%") print(f"Current Memory: {memory.buffer}") return subtitles
主な変更点:
非同期処理の最適化:
translate_subtitles
関数内での非同期呼び出しを最適化し、必要に応じてバッチ処理を検討。エラーハンドリングの強化:
ロギングの導入:
logging
モジュールを使用。パラメータの調整:
MEMORY_SIZE
や MAX_LINE_LENGTH
などのパラメータを適宜調整し、最適な値を見つける。以下に、上述の改善点を反映した最終的なコードの一部を示します。
import os import srt import asyncio from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain from langchain.memory import ConversationBufferWindowMemory from srt import compose import nest_asyncio import subprocess from janome.tokenizer import Tokenizer import re import logging nest_asyncio.apply() # ログ設定 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # 定数 OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') MODEL_NAME = "gpt-4o-mini" TEMPERATURE = 0.1 MEMORY_SIZE = 20 MAX_LINE_LENGTH = 40 MAX_LINES = 2 # LLMの初期化 os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY llm = ChatOpenAI(model_name=MODEL_NAME, temperature=TEMPERATURE) template = """あなたはプロの翻訳者であり、字幕翻訳の専門家です。以下の点を厳守し、自然で正確な日本語に翻訳してください。 * 口語的な表現を適切に使用する * 文脈に合わせた適切な語彙を選択する * 字幕のニュアンスや感情を正確に伝える * 字幕のタイミングと長さを考慮し、簡潔かつ読みやすい表現にする * 前後の字幕の内容を考慮し、一貫性を保つ * 固有名詞や専門用語はそのまま、または適切に翻訳する * 翻訳後のテキストが自然で流暢な日本語になるように調整する 原文: {text} """ prompt = ChatPromptTemplate.from_template(template) # ConversationBufferWindowMemoryの初期化 memory = ConversationBufferWindowMemory(k=MEMORY_SIZE, input_key='text', memory_key='chat_history') # 翻訳チェインの定義 chain = LLMChain(llm=llm, prompt=prompt, memory=memory) # ...(その他の関数は前述の通り)... async def translate_subtitles(subtitles): """字幕データを逐次的に翻訳し、メモリを更新します。 Args: subtitles (list): 翻訳する字幕データのリスト。 Returns: list: 翻訳された字幕データのリスト。 """ total_subtitles = len(subtitles) for idx, subtitle in enumerate(subtitles): try: # 現在の字幕をmemoryに追加(原文) memory.save_context({"text": subtitle.content}, {"response": ""}) # 翻訳を実行 result = await chain.apredict(text=subtitle.content) translated_text = result.strip() # 翻訳結果をsubtitleに設定 subtitle.content = translated_text # 翻訳結果をmemoryに追加(訳文) memory.save_context({"text": translated_text}, {"response": ""}) progress = (idx + 1) / total_subtitles * 100 logging.info(f"Translation progress: {progress:.2f}%") except Exception as e: logging.error(f"Error translating subtitle {subtitle.index}: {e}") return subtitles # ...(メイン実行部分も前述の通り)...
主な追加点:
これらの改善により、改行処理のパフォーマンスが向上し、翻訳の品質も高まることが期待されます。必要に応じて、さらに細かい調整や追加の最適化を行ってください。