jackllll1312 / test2

0 stars 0 forks source link

L #2

Open jackllll1312 opened 5 months ago

jackllll1312 commented 5 months ago

import os from pptx import Presentation from pptx.util import Pty from openai import AzureOpenAI from tqdm import tqdm

class PPTTranslator: def init(self): self.client = AzureOpenAI( api_key=("77a0ca4ac2524d5f97a937bf4b69e305"), api_version="2023-12-01-preview", azure_endpoint=("https://azure-openai-ais-poc.openai.azure.com/") ) self.conversation = [] self.system_message = {"role": "system", "content": "你擅長將英文翻譯成繁體中文"} self.reset_conversation()

def reset_conversation(self):
    # Reset the conversation by adding the system message
    self.conversation = [self.system_message]

def translate_text(self, original_text):
    original_text = original_text.replace("…", " ")
    # Skip empty text frames
    if not original_text.strip():
        return original_text

    # Check if the text contains only numbers
    if original_text.isdigit():
        return original_text

    # Append user message to the conversation
    user_message = {"role": "user", "content": original_text}
    self.conversation.append(user_message)

    # Generate reply from OpenAI Chat API
    response = self.client.chat.completions.create(
        model="TestPOC35Turbo",
        messages=[{"role": msg["role"], "content": msg["content"]} for msg in self.conversation]
    )

    # Extract assistant's reply from the response
    assistant_reply = response.choices[0].message.content

    # Append assistant's reply to the conversation
    assistant_message = {"role": "assistant", "content": assistant_reply}
    self.conversation.append(assistant_message)

    # Return the translated text
    return assistant_reply

def apply_formatting(self, shape, translated_text):
    # Apply formatting to the text box on the slide
    shape.text_frame.text = translated_text

def calculate_total_tokens(self):
    # Calculate the total tokens in the conversation
    return sum(len(msg["content"].split()) for msg in self.conversation)

def translate_ppt(ppt_filename, start_slide=0, save_interval=3): ppt_translator = PPTTranslator()

# Load PPT presentation
presentation = Presentation(ppt_filename)

# Default user message
default_user_message = "幫我把以下內容全部翻成「繁體中文」"
print(f"\nDefault User Message: {default_user_message}")

# Reset conversation to include the system message
ppt_translator.reset_conversation()

# Append default user message to the conversation
ppt_translator.conversation.append({"role": "user", "content": default_user_message})

# Counter to reset conversation every save_interval slides
slide_counter = 0

# Iterate through each slide and translate text
for slide_number, slide in tqdm(enumerate(presentation.slides), desc="Translation Progress", total=len(presentation.slides)):
    if slide_number < start_slide:
        continue

    for shape_number, shape in enumerate(slide.shapes):
        if shape.has_text_frame:
            # Get original English text
            original_text = shape.text

            # Skip empty text frames
            if not original_text.strip():
                continue

            # Translate text
            translated_text = ppt_translator.translate_text(original_text)

            # Update text in the PPT slide with original font size
            ppt_translator.apply_formatting(shape, translated_text)

            # Print translation details
            print(f"\nSlide {slide_number + 1}, Text {shape_number + 1}")
            print(f"Original: {original_text}")
            print(f"Translation: {translated_text}")

    # Increment the slide counter
    slide_counter += 1

    # Reset conversation and send a new request every save_interval slides
    if slide_counter == save_interval:
        ppt_translator.reset_conversation()
        slide_counter = 0

        # Display total token usage
        print(f"\nTotal Token Usage: {ppt_translator.calculate_total_tokens()}")

        # Ask if user wants to save the translated PPT
        save_option = input("\nDo you want to save the translated PPT? (y/n): ").lower()
        if save_option == 'y':
            # Save the translated PPT
            translated_filename = ppt_filename.replace('.', f'_translated中文_slide{slide_number + 1}.')
            translated_file_path = os.path.join(os.getcwd(), translated_filename)
            presentation.save(translated_file_path)
            print(f"\nTranslation saved: {translated_filename}")

# Save the final translated PPT
translated_filename = ppt_filename.replace('.', '_translated中文_final.')
translated_file_path = os.path.join(os.getcwd(), translated_filename)
presentation.save(translated_file_path)

print(f"\nFinal translation completed: {ppt_filename} -> {translated_filename}")

if name == 'main': ppt_filename = "Application Landscape Rationalisation in Post-Merger Integration Projects.pptx" start_slide = 0 # Change the start_slide value as needed save_interval = 3 # Number of slides to translate before saving translate_ppt(ppt_filename, start_slide, save_interval)

jackllll1312 commented 5 months ago

import os from pptx import Presentation from pptx.util import Pt from openai import AzureOpenAI from tqdm import tqdm

class PPTTranslator: def init(self): self.client = AzureOpenAI( api_key="77a0ca4ac2524d5f97a937bf4b69e305", api_version="2023-12-01-preview", azure_endpoint="https://azure-openai-ais-poc.openai.azure.com/" ) self.system_message = {"role": "system", "content": "你擅長將英文翻譯成繁體中文"} self.reset_conversation()

def reset_conversation(self):
    self.conversation = [self.system_message]

def translate_text(self, original_text):
    # Similar implementation as before
    pass

def apply_formatting(self, shape, translated_text):
    # Similar implementation as before
    pass

def calculate_total_tokens(self):
    # Similar implementation as before
    pass

def translate_ppt(self, ppt_filename, start_slide=0, save_interval=3):
    ppt_translator = PPTTranslator()
    presentation = Presentation(ppt_filename)
    default_user_message = "幫我把以下內容全部翻成「繁體中文」"
    print(f"\nDefault User Message: {default_user_message}")

    ppt_translator.reset_conversation()
    ppt_translator.conversation.append({"role": "user", "content": default_user_message})

    slide_counter = 0

    for slide_number, slide in tqdm(enumerate(presentation.slides), desc="Translation Progress", total=len(presentation.slides)):
        if slide_number < start_slide:
            continue

        for shape_number, shape in enumerate(slide.shapes):
            if shape.has_text_frame:
                original_text = shape.text
                if not original_text.strip():
                    continue

                translated_text = ppt_translator.translate_text(original_text)
                ppt_translator.apply_formatting(shape, translated_text)

        slide_counter += 1

        if slide_counter % save_interval == 0:
            ppt_translator.reset_conversation()
            ppt_translator.conversation.append({"role": "user", "content": default_user_message})
            print(f"\nReset conversation after translating {save_interval} slides.")
            print(f"Total Token Usage (reset after every {save_interval} slides): {ppt_translator.calculate_total_tokens()}")
            ppt_translator.reset_conversation()  # Reset the conversation to clear token count

    # Save the final translated PPT after the loop completes
    translated_filename = ppt_filename.replace('.', '_translated中文_final.')
    translated_file_path = os.path.join(os.getcwd(), translated_filename)
    presentation.save(translated_file_path)
    print(f"\nFinal translation completed: {ppt_filename} -> {translated_filename}")

if name == 'main': ppt_filename = "Application Landscape Rationalisation in Post-Merger Integration Projects.pptx" start_slide = 0 save_interval = 3 PPTTranslator().translate_ppt(ppt_filename, start_slide, save_interval)