LoginSignup
2
2
生成AIに関する記事を書こう!
Qiita Engineer Festa20242024年7月17日まで開催中!

人生初英語プレゼンの準備の半分を OpenAI API に手伝ってもらって苦手意識が大分減った話

Posted at

2024/06/13 に人生初の英語プレゼンして、
英語苦手で嫌すぎた 準備が大変過ぎたが故、結果壁に多くぶつかった結果、
得られるものがあったのでまとめます!

結論

英語の発表を OpenAI API で何とか乗り切るコツは、

  • 自然な英訳
  • 発音の音声ファイル化

を OpenAI API にやってもらうことです。

概要

背景

  • ここ数年、僕は半年に1回頻度で日本語で社内発表継続中
  • 不定期で海外メンバとオフライン会議も実施
  • 今回お前4月の社内発表を英語で発表せいとなり、資料英語化&英語プレゼンが必要
  • 英語めっちゃ苦手。英語の発表未経験。。

発表準備の手順

  • 手動:発表原稿作成
    • 日本語で1文を短めに作成
  • OpenAI API:英訳(日本語テキスト→英語テキスト)
    • 英訳時以下も依頼する
      • 「直訳しないで。自然に意訳して。」
      • 「N歳レベルの語彙力で翻訳して」(今回は15歳)
      • 「1文短めにして」
  • OpenAI API:音声ファイル化(英語テキスト→英語音声ファイル)
    • スピードを3種類で出力。70%、80%、90%
    • 最初はゆっくり目で耳と口を慣らす
    • 慣れてきたらスピードを上げていく
  • 手動:発音練習
    • 70%、80%、90% の音声ファイルで順番に練習
    • 最初はゆっくり目で耳と口を慣らす
    • 慣れてきたらスピードを上げていく

OpenAI 無しの全て手動時大変だったこと

一旦乗り切って振り返ると、OpenAI 無しの全て手動時大変だったのは

  • 英訳時、「直訳ではないか、自然な言い回しになっているか」の確認工数が大だった。というか無限に時間が必要だった
  • 発表練習時、その内容での手近なお手本が無い

OpenAI API に手伝ってもらうときの利点

  • 「自然な英訳」を瞬殺。その時間を減らせる。
  • 「発表練習」のお手本が簡単に手に入る。発音スピードも自由自在
  • 何度もナチュラル発音聴くとナチュラル発音する恥ずかしさが消える
    • 「Q&A」を「キューアンドエー」じゃなくて「キューエヌエー」と発音するのは当たり前だが?という気持ちになれる

お気持ち

  • プレゼンで大事なのは、日本語発表でも英語発表でも「如何に早く発表練習」状態に持っていくか
  • そういう意味でも日々のネタ収集とか、スライド初版作成とかをサッサと終わらせるのが大事

初めて英語発表した結果

  • 自信が持てて良かった
    • 「英語の発表死んでも嫌だが?」から
    • 「まぁやるならやるでも。ただめっちゃ時間使うけど。。」まで意識が変わって良かった
  • 来日メンバ、オンライン参加の海外メンバの複数人から好評で「自国のお客さんにそのデモ持っていく」と言われグローバルでチャンスが増えたことが良かった
  • 何箇所か海外メンバに対しても笑いが取れてよかった
    • 普段日本語発表では「発表毎に絶対複数回笑わせてやる!」の気概で臨んでる
    • 今回の冒頭のスライドでは、以下あたり
I converted all the presentation to audio files using my great OpenAI API skills. 
It was a breeze! :)
If I were an audience, I would certainly listen to the audio files…

私は高 OpenAI API スキルを使って全ての発表を音声ファイル化した。
楽勝!
もし私が聴講者なら、私は確実に音声ファイルを聴く。。
Please call me “Naohiko”
Because the easy-to-say "Nao" has been taken by Yoroizuka-san in NFBE dev team. 

「ナオヒコ」と呼んでください。
なぜなら言い易い「ナオ」は既に鎧塚さんに取られているから。

スライド例

P2:「最初の注意点」:スライド

Screenshot from 2024-06-19 20-13-06.png

P2:「最初の注意点」:日本語原稿

---
最初に、注意点です。
私は英語が非常に苦手です。
英語の発表が人生初です。
とても緊張しています。
そして今回の発表の主旨は「OpenAI API を使って AI に喋らせる」という内容です。

英語話者へのお願いです。
1、もし私の英語が聞きとれなければ、
各スライドの音声ボタンを押してください。
話す内容を OpenAI API で音声ファイル化した。楽勝!
2、質疑時はシンプルかつゆっくり発音お願いします。

日本語話者へのお願いです。
質疑時翻訳お願いします!!!
フォローお願いします!!!
---

P2:「最初の注意点」:英訳

---
First, attention please.

I'm really not good at English.
This is my first time presenting in English.
I'm very nervous.
The theme of this presentation is "making AI talk using the OpenAI API".

For English Speakers, I've two requests.
1, If you can not understand my English, please press the audio button on each slide. 
I converted my presentation into audio files with my great OpenAI API skills. It was a breeze!
2, Please ask your questions simply and slowly during the Q&A.

For Japanese Speakers:
Please translate during the Q&A!!!
I need your support!
---

P3:「自己紹介1/2」:スライド

Screenshot from 2024-06-19 21-14-37.png

P3:「自己紹介1/2」:日本語

ここから本題です。
自己紹介します。
渡邉直彦です。
2007年にACCESS社へ新卒入社しました。
ブラウザチームのマネージャーです。
50プロジェクト程経験しています。
現在の楽しみは以下です。
1つ目は育児で、娘が2人います。9歳と7歳です。
娘が電子工作やりたいと言っていたので、週末一緒に作ってる。
私の育児の夢は彼らを理系に進ませることです。彼らが望む限り。
2つ目はウォーキングです。
秋葉原からたまに歩いて帰ります。2-3時間かけて。

私のことは「ナオヒコ」と呼んでください。
言い易い「なお」は Yoroizuka-san に取られた。

P3:「自己紹介1/2」:英語

Now, let's talk about the main topic.
First, I'll introduce myself.
I'm Naohiko Watanabe.
I joined ACCESS as a new grad in 2007.
I'm a manager in the browser team,
and I've experience in around 50 projects.

Things I'm currently enjoying:
The first is child care, and I've two daughters, 9 and 7 years old.
Recently, Older daughter requested an electronics kit for her birthday this April.
So we've been creating it together on weekends.
My dream is to raise my children to be in STEM fields, as long as they wish.
The second is walking.
Sometimes I walk home from Akihabara. It takes 2 or 3 hours.

Please call me "Naohiko."
Because the easy-to-say "Nao" has been taken by Yoroizuka-san.

P4:「自己紹介2/2」:スライド

Screenshot from 2024-06-19 20-15-23.png

P4:「自己紹介2/2」:日本語

私は日本語でなら発表好きです。
過去発表で多い話題は「ブラウザ」、「車載」、「プロジェクトマネジメント」です。
人気の発表は「mobile game の自動化」です。

P4:「自己紹介2/2」:英語

I like presentations if it's Japanese. 
I usually present on topics like "browsers," "in-vehicle" and "project management."
My popular presentation is "Automation of mobile game".

詳細

「直訳」「意訳」指定結果の比較

P4自己紹介スライドの過去社内発表タイトルを

  • 「単に訳して」
  • 「自然に平易に意訳して」

と依頼時の結果をまとめます。
社内発表タイトルは長い一文&日本語スラング感多めなので有る意味丁度良い。

そしてこのサンプルコード利用時は適切に自分の状況に合うようにプロンプト変更お願いします!

日本語

2014/01/24 [社外] html5j 自動車部 #2 - 車載組込ブラウザの過去7年と今を40分でまとめてみる
2014/06/14 [社外] html5j - HTML5 Night - Web x Embedded System
2017/04/08 [社外] Yocto Project 勉強会 #3 - 初心者の初心者による初心者のための AGL on Yocto on R-Car M2
2017/04/19 車載で技術的に苦労している点 
2018/01/23 ソシャゲの自動化したら 奥さんにキレられなくなって 幸せになった話
2018/07/24 React未経験から運良く3案件連続で触れられたのでReact初心者あるある2018言いたい
2018/09/26 HUNTER×HUNTER に見る お客さん対応のコツ
2019/07/11 WP事業部勉強会 - プロジェクトマネジメント基礎 
2019/12/02 PM スペシャリスト ロマン・ソロバン会 #1 - XXXX 案件
2020/01/21 中瀬くん結婚式余興を支える技術
2020/09/29 課長半年やって課長業完全に理解した() / 課長から「頼れる!」と思われるコツ
2021/01/19 弊社デスマ経験活かしてIPAプロジェクトマネージャ試験合格したので論述原稿晒す
2021/07/15 原価1[億円/年]規模案件のサポート費用請求システム / 怖くなかったピボットテーブル
2022/01/22 絵で理解する ChromeExtensions / サボるをガチる
2022/06/14 Qiita 1000 Contribution 達成したのでいいねもらうコツまとめる
2022/10/11 ぼくたちのかんがえたさいきょうのプロジェクトスターターキット
2023/05/18 数多の特級呪物案件を祓った結果ACSmineの使い方限界突破した
2023/06/16 [社外] ChatGPT(GPT-4) で一撃でスクレイピングするコードを生成出来たので感想とコツ
2023/09/07 ChatGPT さん作成物2桁超えた時点でのゴリゴリの Custom Instructions 見て!

「直訳」時

入力プロンプト

Translate from Ja to En.

出力

2014/01/24 [External] html5j Automotive Department #2 - Summarizing the Past 7 Years and Present of In-Vehicle Embedded Browsers in 40 minutes
2014/06/14 [External] html5j - HTML5 Night - Web x Embedded System
2017/04/08 [External] Yocto Project Study Meeting #3 - AGL on Yocto on R-Car M2 for Beginners by Beginners
2017/04/19 Technical Challenges in Automotive 
2018/01/23 How I Became Happy by Automating Social Games and No Longer Getting Scolded by My Wife
2018/07/24 I Want to Talk About 2018 React Beginners' Common Issues as I was Lucky to handle 3 projects in a row without React Experience
2018/09/26 Tips on Customer Response as Seen in HUNTER×HUNTER
2019/07/11 WP Business Division Study Meeting - Basics of Project Management 
2019/12/02 PM Specialist Roman Soloban Meeting #1 - XXXX Project
2020/01/21 Technology to Support Nakase's Wedding Ceremony
2020/09/29 I Completely Understand the Role of Section Chief after Half a Year / Tips for Being Regarded as "Reliable" by Your Section Chief
2021/01/19 I Passed the IPA Project Manager Exam Using My Company's Death March Experience, So I'll Show My Essay
2021/07/15 Support Fee Billing System for Costs 1 [100 million yen/year] Scale Projects / The Pivot Table That Wasn't Scary
2022/01/22 Understanding Chrome Extensions Through Drawings / Making Laziness Serious
2022/06/14 I Reached 1000 Contributions on Qiita, So I'll Summarize Tips on Getting Likes
2022/10/11 Our Thought of the Strongest Project Starter Kit
2023/05/18 I've Broken Through the Limits of Using ACSmine After Exorcising Numerous Super-class Cursed Projects
2023/06/16 [External] ChatGPT(GPT-4) - Impressions and Tips on Creating Scraping Code in One Shot
2023/09/07 Look at the Hard Custom Instructions When the Number of ChatGPT Created Items Exceeded Double Digits!

「自然に平易に意訳」時

入力プロンプト

# 翻訳の基本指示
BASIC_TRANSLATION_INSTRUCTION = "Translate from Ja to En."

# スタイル指示のテンプレート
STYLE_INSTRUCTION_TEMPLATE = (
    "Style: 社内の勉強会の発表向け。発表内容は真面目、しかし話し方はフレンドリーさ重視で10年来の親友に話すような感じで。"
    "話者の自分は英語が非常に苦手。"
    "出来る限り平易でシンプルな文章にして。高校生1年生が知ってる単語を使うレベルで。"
    "一文は短くして。出来る限り関係代名詞使わないで欲しい。"
    "例:「英語話者へ」を意味するときは「For English Speakers」と表現して。「To those who speak English」ではなく。"
    "冒頭の主語と動詞は短縮系にして。「I am」は「I'm」へ、「I have」は「I've」へ等。"
    "自然に意訳して。常用表現で翻訳して。"
    "例:日本語の「処理時間」は「execution time」「response time」と訳す等。「processing time」ではなく。"
    "固有名詞や技術的な専門用語、API名等はその限りではない。「OpenAI API」はそのまま使用するなど。"
)

出力

2014/01/24 [Outside] html5j Car Section #2 - The past 7 years and present of onboard browsers summed up in 40 minutes
2014/06/14 [Outside] html5j - HTML5 Night - Web x Embedded System
2017/04/08 [Outside] Yocto Project Study Session #3 - Beginner's guide for AGL on Yocto on R-Car M2 by beginners for beginners
2017/04/19 Struggling points in automotive technology 
2018/01/23 About my happy life without getting scolded by my wife since automating Social games
2018/07/24 I want to share React beginner's tips 2018, as I luckily got to handle React in three consecutive projects with no previous experience
2018/09/26 Tips for customer service seen in HUNTER×HUNTER
2019/07/11 WP Business Division Study Session - Basics of Project Management 
2019/12/02 PM Specialist Roman Solo Session #1 - XXXX Project
2020/01/21 Technologies supporting the after-party performance at Nakase-kun's wedding
2020/09/29 Understand the role of a section chief completely in half a year / Tips for being considered 'reliable' by a section chief
2021/01/19 I passed the IPA Project Manager exam utilising the company's death march experience, so I will expose my essay draft
2021/07/15 Support fee billing system for projects of a scale of 1 billion yen per annum / Pivot tables that didn't scare me
2022/01/22 Understand ChromeExtensions with illustrations / Seriously getting out of work
2022/06/14 Achieved 1000 Contributions on Qiita, so I'll summarize tips to get likes
2022/10/11 Our thought of the strongest project starter kit
2023/05/18 Mastered the use of ACSmine by dealing with numerous top-rank cursed product cases
2023/06/16 [Outside] Managed to generate a scraping code with a single punch with ChatGPT(GPT-4), so here are my thoughts and tips
2023/09/07 Look at the gritty Custom Instructions once the works created by Mr. ChatGPT exceed two digits!

自然さ平易さの比較

自然さ平易さの比較結果です。
僕は感覚が無いので、 ChatGPT さんに聞いた結果です。

具体例1

日本語:
2018/07/24 React未経験から運良く3案件連続で触れられたのでReact初心者あるある2018言いたい

直訳:
2018/07/24 I Want to Talk About 2018 React Beginners' Common Issues as I was Lucky to handle 3 projects in a row without React Experience

意訳:
2018/07/24 I want to share React beginner's tips 2018, as I luckily got to handle React in three consecutive projects with no previous experience

違いの説明:

直訳: 文法的には正しいが、冗長でフォーマルな表現。「I Want to Talk About」は硬く、「Beginners' Common Issues」は不自然。
意訳: 短くてシンプルな表現。「I want to share React beginner's tips」はフレンドリーでわかりやすい。

具体例2

日本語:
2022/06/14 Qiita 1000 Contribution 達成したのでいいねもらうコツまとめる

直訳:
2022/06/14 I Reached 1000 Contributions on Qiita, So I'll Summarize Tips on Getting Likes

意訳:
2022/06/14 Achieved 1000 Contributions on Qiita, so I'll summarize tips to get likes

違いの説明:

直訳: 文法的には正しいが、フォーマルでやや冗長。「Summarize Tips on Getting Likes」は硬い。
意訳: 短くてシンプルな表現。「I'll summarize tips to get likes」は自然でわかりやすい。

発音速度の比較

僕はざっくり、

  • 0.7倍:10回
  • 0.8倍:100回
  • 0.9倍:100回

くらいの回数シャードイング(OpenAI API さんの通りに発音練習)しました。
1.0倍は早すぎて無理で今回は諦め。。。

テキスト

First, attention please.

I'm really not good at English.
This is my first time presenting in English.
I'm very nervous.
The theme of this presentation is "making AI talk using the OpenAI API".

For English Speakers, I've two requests.
1, If you can not understand my English, please press the audio button on each slide. 
I converted my presentation into audio files with my great OpenAI API skills. It was a breeze!
2, Please ask your questions simply and slowly during the Q&A.

For Japanese Speakers:
Please translate during the Q&A!!!
I need your support!

音声ファイル

サンプルコード

最後にサンプルコードです。
自分のはもう少し作り込んでるけど、ここに貼るのはシンプルさ重視で。

英訳(日本語テキスト→英語テキスト)

# coding: utf-8
import argparse
import sys
from pathlib import Path
from openai import OpenAI
from datetime import datetime

OPENAI_API_KEY = "sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

# 翻訳の基本指示
BASIC_TRANSLATION_INSTRUCTION = "Translate from {source_lang} to {target_lang}."

# スタイル指示のテンプレート
STYLE_INSTRUCTION_TEMPLATE = (
    "Style: 社内の勉強会の発表向け。発表内容は真面目、しかし話し方はフレンドリーさ重視で10年来の親友に話すような感じで。"
    "話者の自分は英語が非常に苦手。"
    "出来る限り平易でシンプルな文章にして。高校生1年生が知ってる単語を使うレベルで。"
    "一文は短くして。出来る限り関係代名詞使わないで欲しい。"
    "例:「英語話者へ」を意味するときは「For English Speakers」と表現して。「To those who speak English」ではなく。"
    "冒頭の主語と動詞は短縮系にして。「I am」は「I'm」へ、「I have」は「I've」へ等。"
    "自然に意訳して。常用表現で翻訳して。"
    "例:日本語の「処理時間」は「execution time」「response time」と訳す等。「processing time」ではなく。"
    "固有名詞や技術的な専門用語、API名等はその限りではない。「OpenAI API」はそのまま使用するなど。"

    "---(ハイフン3つ)と書かれた行はスライドの区切り。区切り毎に翻訳して。区切りを超えて順番を変えないで。"
)

def generate_speech(text, speed=1.0):
    """
    テキストを音声に変換する関数。テキスト内の「---」をスライド番号に置き換える。

    Args:
        text (str): 音声に変換するテキスト
        speed (float): 音声の再生速度(0.25から4.0の範囲で指定)

    Returns:
        list of str: 生成された音声ファイルのパスのリスト
    """
    slides = text.split('---')
    processed_texts = []
    current_text = ''
    max_length = 3000  # 最大文字数

    print("Debug: スライドの分割完了。スライド数: {}".format(len(slides)))

    # OpenAIクライアントの初期化
    client = OpenAI(api_key=OPENAI_API_KEY)

   # 各スライドを処理
    for i, slide in enumerate(slides):
        # スライド番号を「スライド1」、「スライド2」などと置き換える
        slide_text = f"slide{i + 1}\n{slide.strip()}\n"
        processed_texts.append(slide_text)

    audio_paths = []

    # 各テキストブロックに対して音声を生成
    for index, text_block in enumerate(processed_texts):
        response = client.audio.speech.create(
            model="tts-1-hd",
            voice="fable",
            input=text_block,
            speed=speed)

        now = datetime.now()

        # 音声ファイル化
        temp_file_path = Path(__file__).parent / f"speech_{now.strftime('%Y%m%d_%H%M%S')}_{index + 1}_speed{speed}.mp3"
        response.stream_to_file(temp_file_path)

        print(f"Debug: Audio file: {temp_file_path}")  # 生成された音声ファイルのパスを出力
        audio_paths.append(str(temp_file_path))

    return audio_paths

def translate_text(text, source_lang="ja", target_lang="en"):
    """
    テキストを指定された言語に翻訳する関数

    Args:
        text (str): 翻訳するテキスト
        source_lang (str): 翻訳前の言語コード
        target_lang (str): 翻訳後の言語コード

    Returns:
        str: 翻訳されたテキスト
    """
    client = OpenAI(api_key=OPENAI_API_KEY)
    basic_instruction = BASIC_TRANSLATION_INSTRUCTION.format(
        source_lang=source_lang,
        target_lang=target_lang
    )
    full_instruction = f"{basic_instruction} {STYLE_INSTRUCTION_TEMPLATE}"

    translation = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": full_instruction},
            {"role": "user", "content": text}
        ]
    )
    translated_text = translation.choices[0].message.content

    now = datetime.now()
    # 翻訳テキストをファイル化
    temp_file_path = Path(__file__).parent / f"trans_{now.strftime('%Y%m%d_%H%M%S')}.txt"
    with open(temp_file_path, 'w', encoding='utf-8') as file:
        file.write(translated_text)
    print(f"Debug: Translated text saved to {temp_file_path}")

    return translated_text

def main():
    # コマンドライン引数の解析
    description_text = (
        "Convert text to an audio file.\n\n"
        "Please specify either text or a file. Translation into English is also possible.\n"
        "テキストかファイルのどちらかを指定してください。英訳も可能です。喋るスピード指定も可能です。\n"
        "例1: python text_to_speech_test.py --text 'こんにちは'\n"
        "例2: python test_to_speech_test.py --file 'sample_en.txt'\n"
        "例3: python test_to_speech_test.py --file 'sample_ja.txt' --translate\n"
        "例4: python test_to_speech_test.py --file 'sample_ja.txt' --translate --speed=0.9\n"
    )
    parser = argparse.ArgumentParser(description=description_text, formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument('--text', metavar='T', type=str, help='Convert English text to an English audio file by specifying the text directly.')
    parser.add_argument('--file', metavar='F', type=str, help='Convert English text to an English audio file by specifying an English file.')
    parser.add_argument('--translate', action='store_true', help='This option starts with Japanese text.')
    parser.add_argument('--speed', type=float, default=1.0, help='Set the speech speed of the speech. Valid range is 0.25 to 4.0.')

    args = parser.parse_args()

    # スピードのバリデーション
    if not (0.25 <= args.speed <= 4):
        print("Error: Speed must be between 0.25 and 4.0")
        return

    if args.file:
        with open(args.file, 'r', encoding='utf-8') as f:
            text = f.read()
    elif args.text:
        text = args.text
    else:
        parser.print_help()
        return

    # 翻訳オプションが指定されている場合、テキストを翻訳する
    if args.translate:
        translated_text = translate_text(text)
        text = translated_text

    # テキストを音声に変換する
    audio_file_path = generate_speech(text, args.speed)

if __name__ == "__main__":
    main()

サンプルテキスト

$ cat test_ja.txt 
おはようございます。

---

こんにちは。

---

こんばんは。

使い方

テキストを起動引数で指定し音声ファイル化

$ python3 ./text_to_speech_test.py --text "こんにちは"
Debug: スライドの分割完了。スライド数: 1
Debug: Audio file: speech_20240617_212442_1_speed1.0.mp3

speech_20240617_212442_1_speed1.0.mp3 実行で「こんにちは」と喋る。

テキストを起動引数で指定&英訳&音声ファイル化

$ python3 ./text_to_speech_test.py --text "こんにちは" --translate
Debug: Translated text saved to trans_20240617_212448.txt
Debug: スライドの分割完了。スライド数: 1
Debug: Audio file: speech_20240617_212442_1_speed1.0.mp3

speech_20240617_212442_1_speed1.0.mp3 実行で「Hello」と喋る。

テキストをファイルで指定&英訳&発音スピード指定&音声ファイル化

$ python3 ./text_to_speech_test.py --file test_ja.txt --translate --speed=0.9
Debug: Translated text saved to trans_20240617_212448.txt
Debug: スライドの分割完了。スライド数: 3
Debug: Audio file: speech_20240617_212449_1_speed0.9.mp3
Debug: Audio file: speech_20240617_212451_2_speed0.9.mp3
Debug: Audio file: speech_20240617_212452_3_speed0.9.mp3

$ cat trans_20240617_212448.txt
Good morning.

---

Hello.

---

Good evening.

まとめ

OpenAI API で英語の発表が出来るようになりました!

2024/05/13 の GPT-4o 発表時の「翻訳こんにゃく」的なほぼ同時通訳アプリが出たら日常会話はこれで良い気はするけども、発表が無くなることも無いと思うので、今回一発やって拒否反応を減らせて良かった。
https://openai.com/index/spring-update/


2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2