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 で音声の取得