Ollama gemma3 4b の読み上げ

Ollama gemma3 4b の読み上げ

import requests
import pyttsx3

# Ollama設定
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL_NAME = "gemma3:4b"  # モデル名(必要に応じてgemma3:4bに)

# 音声読み上げエンジン初期化
engine = pyttsx3.init()

def ask_ollama(prompt):
    payload = {
        "model": MODEL_NAME,
        "prompt": prompt,
        "stream": False
    }
    response = requests.post(OLLAMA_URL, json=payload)
    if response.status_code == 200:
        result = response.json()
        return result.get("response", "")
    else:
        print(f"Error: {response.status_code}")
        return ""

def speak(text):
    engine.say(text)
    engine.runAndWait()

def main():
    # 質問文
    prompt = "おはよう"
    
    # Ollamaに送信
    reply = ask_ollama(prompt)
    print("Ollamaの回答:", reply)
    
    # 読み上げ
    if reply:
        speak(reply)
    else:
        speak("エラーが発生しました。")

if __name__ == "__main__":
    main()

で実行したけど絵文字が入ると読み上げが変になるので削除

またrequest を使わないようにするので
Ollama gemma3 python で検索

OllamaとGemma3でローカルLLMをPythonで実行する
を参考に変更

読み上げの時に回答に絵文字などがあるとわかりにくいため、絵文字などは削除するので
Re を使う

from ollama import chat
from ollama import ChatResponse
import pyttsx3
import re

# モデル名
MODEL_NAME = 'gemma3:4b'

# pyttsx3 初期化
engine = pyttsx3.init()

def remove_emoji(text: str) -> str:
    # Unicode範囲を指定して絵文字を除去する正規表現
    emoji_pattern = re.compile(
        "["
        "\U0001F600-\U0001F64F"  # 顔文字
        "\U0001F300-\U0001F5FF"  # 天気や地図記号
        "\U0001F680-\U0001F6FF"  # 乗り物
        "\U0001F1E0-\U0001F1FF"  # 国旗
        "\U00002700-\U000027BF"  # その他の記号
        "\U000024C2-\U0001F251"
        "]+",
        flags=re.UNICODE
    )
    cleaned_text = emoji_pattern.sub('', text)
    return cleaned_text

def ask_ollama(prompt: str) -> str:
    try:
        response: ChatResponse = chat(model=MODEL_NAME, messages=[
            {
                'role': 'user',
                'content': prompt,
            }
        ])
        return response.message.content
    except Exception as e:
        print(f"Ollamaエラー: {e}")
        return "エラーが発生しました。"

def speak(text: str):
    # ここで絵文字を除去してから読み上げ
    clean_text = remove_emoji(text)
    engine.say(clean_text)
    engine.runAndWait()

def main():
    prompt = "おはよう。日本語で答えてください。"

    reply = ask_ollama(prompt)
    print("Ollamaの回答(絵文字付き):", reply)

    speak(reply)

if __name__ == "__main__":
    main()

これだと機能しない

pip install emoji

で絵文字を削除できるのでインストールしておく

import emoji

def remove_emoji(text: str) -> str:
    # emojiパッケージを使う方法(こちらの方が確実)
    return emoji.replace_emoji(text, replace='')

を追加

全体は

from ollama import chat
from ollama import ChatResponse
import pyttsx3
import re

# モデル名
MODEL_NAME = 'gemma3:4b'

# pyttsx3 初期化
engine = pyttsx3.init()

def ask_ollama(prompt: str) -> str:
    try:
        response: ChatResponse = chat(model=MODEL_NAME, messages=[
            {
                'role': 'user',
                'content': prompt,
            }
        ])
        return response.message.content
    except Exception as e:
        print(f"Ollamaエラー: {e}")
        return "エラーが発生しました。"

def speak(text: str):
    # 絵文字を除去
    clean_text = remove_emoji(text)
    print("読み上げ用のテキスト:", clean_text)  # ←追加してデバッグ
    engine.say(clean_text)
    engine.runAndWait()

import emoji

def remove_emoji(text: str) -> str:
    # emojiパッケージを使う方法(こちらの方が確実)
    return emoji.replace_emoji(text, replace='')


def main():
    prompt = "おはよう。日本語で答えてください。"

    reply = ask_ollama(prompt)
    print("Ollamaの回答(絵文字付き):", reply)

    speak(reply)

if __name__ == "__main__":
    main()

で実行すると

python voice_test.py
Ollamaの回答(絵文字付き): おはようございます!何かお手伝いできることはありますか? 😊

読み上げ用のテキスト: おはようございます!何かお手伝いできることはありますか? 

となって結果から絵文字を削除し読み上げが可能になる

次は
Faster-whisper で音声の取得

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です