3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

unerryAdvent Calendar 2024

Day 12

生成AIを使い、自分の声で外国語を喋らせる

Last updated at Posted at 2024-12-11

はじめに

2023年12月31日 大晦日ハッカソン
https://omisoka-hackathon.connpass.com/event/304711/

2024年9月13日(Fri)18:00 ~ 20:00
[ハイブリッド開催] 生成 AI ではじめる Bot 開発
https://women-ml.connpass.com/event/325067/

最初「大晦日ハッカソン」で作り、9ヶ月後に、回答を生成するOpenAI部分をGeminiに差し替えました。
つまり、自分の声で喋らせる、しかも流暢な外国語で喋らせる部分は2023年12月の段階で既にできてた事になります。

概要

  • Raspberry Piにマイクとスピーカーをつけた自作のスマートスピーカー。話しかけると、生成AIで回答内容を生成して返答する。
  • あらかじめ製作者の声を覚えさせておき、応答は製作者の声で話す。パーマンのコピーロボットのようである。外国語も流暢に喋れる。

仕様

image.png

  • mic: NexiGo N60 USBカメラマイクのマイク部分を使用。
  • Raspberry Pi: 3と4を両方使い、両方とも充分使えた。
  • Speech to text: Googleの speech recognition
  • 回答を考える & 翻訳: OpenAI APIやGemini Pro API
  • Text to Speech: IIElevenLabsのAPI
    • 自分の声を1分間ほど録音してアップロードすると、その声を使った音声合成ができる。月5ドルからの有料サービス。今回はその一番安いコースを契約。
  • speaker: ワイヤレススピーカー

使い方

デモをご覧ください。

コード

以下は、「回答を考える & 翻訳」の得る部分です。
生成AIのモデルは gemini-1.5-flash を使っています。
チャット履歴を引数することにより、連続した会話に対応するようにしました。

# Google AI Studio
import google.generativeai as genai

def get_gemini_response(text, chat_history):
    generation_config = {
        "temperature": 1,
        "top_p": 0.95,
        "top_k": 64,
        "max_output_tokens": 8192,
        "response_mime_type": "text/plain",
    }

    model = genai.GenerativeModel(
        model_name="gemini-1.5-flash",
        generation_config=generation_config,
    )

    # Convert chat history to the correct format
    formatted_history = [
        {"role": "user" if i % 2 == 0 else "model", "parts": [{"text": msg}]}
        for i, msg in enumerate(chat_history)
    ]

    # chat_session = model.start_chat(history=chat_history)
    chat = model.start_chat(history=formatted_history)

    prompt = "Reply in English, in 140 characters or less. \
        Don't use emoji. \
        content is =" + text
        # 安全性に抵触する場合、Exceptionせずに、「答えられません」と回答してください。\
        # If you don't know the correct answer, you don't say lie. \

    response = chat.send_message(prompt)
    return response.text

余談ですが、Alexa スキルのサンデープログラマだった自分にとって、この「連続した会話に対応」機能を達成するには、非常に長大なIF分岐を書く必要があり、いつも断念していました。

それがたった数行で達成できるというのは隔世の感があります。

次は、IIElevenLabsのAPIを呼び出して、自分の声で外国語を喋らす部分です。

まずは設定。

# 11labs の設定
XI_API_KEY = "ここにAPIキーを書く"  #11labs
VOICE_ID = "あなたが作成したボイスIDを書く" #11labs
CHUNK_SIZE = 1024  # Size of chunks to read/write at a time
OUTPUT_PATH = "output.mp3"  # Path to save the output audio file
tts_url = f"https://api.elevenlabs.io/v1/text-to-speech/{VOICE_ID}"
elevenlabs_headers = {
  "Accept": "audio/mpeg",
  "Content-Type": "application/json",
  "xi-api-key": XI_API_KEY
}

以下はメインのロジックの中から、11labsの呼び出し部分。


        # Geminiから回答を得る
        response = get_gemini_response(text, chat_history)
        print(response)
        
        #連続した会話に対応
        chat_history.append(text)
        chat_history.append(response)
        
        # elevenlabs の Text to speechの設定       
        TEXT_TO_SPEAK = response 
        data = {
            "text": TEXT_TO_SPEAK,
            "model_id": "eleven_turbo_v2_5",
            "voice_settings": {
                "stability": 0.5,
                "similarity_boost": 0.8,
                "style": 0.0,
                "use_speaker_boost": True
            }
        }
        response = requests.post(tts_url, headers=elevenlabs_headers, json=data)
        with open('output.mp3', 'wb') as f:
            for chunk in response.iter_content(chunk_size=CHUNK_SIZE):
                if chunk:
                    f.write(chunk)

その他

ChatGPTが音声入力に対応したのは2024年1月だったと思います。
この作品を作成したのが2023年12月だったので、その後すぐにリリースされたものを見て、「もうやる意味ないじゃん。。」とまたしても生成AIあるあるでがっかりしましたが、自分の声で 外国語を喋ることや、スマホアプリではなくハードウェアに乗せたことには意義があったと思います。

いろんな応用がききますからね。

なお、話者の音声を外国語に吹き替えする機能は、Microsoftもリアルタイムで動画を吹き替えする機能を発表しています。

Google も、今年の何月かわすれましたが、いつの間にかChromeで英語->日本語のテキストベースのリアルタイム翻訳ができるようになってました。

私は英語の勉強を4年以上続けてますが、ある程度喋れるようになったと思ったら語彙力が頭打ちして、仕事で使う難しさを痛感していたところだったので、はやく自動翻訳ができるようになったらいいのにと思います。

自動翻訳が一般的になり、会話にわずかなコストを上乗せして税金のように徴収される時代が到来したら、その時英語を喋れる人は、無課金勢と呼ばれるのでしょう。
1年後か3年後か、、

こんなものを作っておいて矛盾していますが、それまでにはなんとかして無課金勢になりたいと思っております。

以上です。

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?