現在地の天気を音声にする

現在地の天気を音声にする

1日の天気を取得するには座標取得が必要
Google で現在地の緯度経度を調べ

for daily_forecast in jsondata["daily"]:
    date = datetime.fromtimestamp(daily_forecast["dt"]).date()
    if date == today:
        min_temp = daily_forecast["temp"]["min"]
        max_temp = daily_forecast["temp"]["max"]
        weather = daily_forecast["weather"][0]["main"]
        description = daily_forecast["weather"][0]["description"]
        break

というように
OpenWeather APIの「Daily Forecast」エンドポイントを使用

ただしそのままだと天気は英語になる

OpenWeather APIで日本語の天気情報を取得するには、APIリクエストにlangパラメータを追加してjaを追加

リクエストURLを

url = "https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude=hourly,minutely&units=metric&lang=ja&appid={API_key}"

とする

これで詳細な天気は日本語になったけど
天気そのものは英語のまま

辞書を作成してもいいけど
おそらく今後天気を追加していくことになるので
面倒なので
DeepLを使って翻訳する

import deepl

auth_key = "取得したDeepLのAPIキー"  # Replace with your key
translator = deepl.Translator(auth_key)

あとは

#天気をdeeplで英語から日本語にする

weather_japanese = translator.translate_text(weather,target_lang="JA")
# 結果の表示
print(f"今日の最高気温: {max_temp}°C")
print(f"今日の最低気温: {min_temp}°C")
print(f"天気: {weather_japanese} ({description})")

とすれば

python current_weather.py
今日の最高気温: 11.26°C
今日の最低気温: 3.72°C
天気: 雲 (薄い雲)

となる

あとはこれをテキストにする

# 今日の天気予報をまとめる
today_weather_repo = f"今日の天気は{weather_japanese}、予想最高気温は{max_temp}°C、予想最低気温は{min_temp}°C です"

# 結果の表示
print(today_weather_repo)

pythonの場合
テキスト内に変数を入れるなら{変数名}で組み込むことができる

これで文章はできたので
次にdockerで voicevox をバックグランドで起動し
ここへテキストを送り音声を作成する

とりあえず

docker run --rm -p '192.168.1.69:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

で前回起動しているが

docker run –rm -p
はDockerコンテナを実行する際に使用されるオプション

これらのオプションは以下のような意味を持ち
–rm:
このオプションは、コンテナの実行が終了した後にコンテナを自動的に削除するようDockerに指示
通常、コンテナは停止してもファイルシステムが保持され、
後でdocker startコマンドで再開することができるが、
–rmオプションがあると、コンテナが停止したときにそのファイルシステムも一緒に削除される
一時的なテストや一回きりの実行に便利

-p:
-pオプションはポートマッピングを設定するために使用
このオプションはホストのポートとコンテナのポートを紐
形式は -p ホストのポート:コンテナのポート
例えば、-p 8080:80 と指定すると、ホストの8080ポートがコンテナの80ポートにマッピングされる

これにより、ホストの8080ポートにアクセスすると、そのリクエストがコンテナの80ポートに転送される

これらのオプションを組み合わせることで、特定のポートを公開しながら
コンテナの使用が終了した後には自動的に削除するように設定することができる

例えば、docker run –rm -p 8080:80 nginx というコマンドは
nginxサーバーを実行するコンテナを作成し
ホストの8080ポートをコンテナの80ポートにマッピングする
そして、コンテナの実行が終了すると、そのコンテナは自動的に削除される

これだとコンテナが消える

やりたいのはバックグランドでvoicevoxの起動なので

docker pull voicevox/voicevox_engine:cpu-ubuntu20.04-latest

でコンテナ取得

バックグランドでの起動は
-d オプションをつければいいので

docker run -d  -p '192.168.1.69:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

でバックグランドで起動

次にMac で

 echo -h "今日の天気は雲、予想最高気温は11.26°C、予想最低気温は3.72°C です" > weather.txt

でテキストを作成

一度停電になり停止したため
再度ubuntu の起動と

docker run -d  -p '192.168.1.69:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest


バックグランドでdocker の起動

再度

cat weather.txt 
-h 今日の天気は雲、予想最高気温は11.26°C、予想最低気温は3.72°C です

で調べたら
余計なものが入っていた

過去ログを見たら
-n オプションの間違いだった

とりあえずファイルを編集し

curl -s -X POST "192.168.1.69:50021/audio_query?speaker=1" --get --data-urlencode text@weather.txt > query.json

でJSONファイルを作成

curl -s -H "Content-Type: application/json" -X POST -d @query.json "192.168.1.69:50021/synthesis?speaker=1" > test_audio.wav

で音声ファイルを作成

Mac でFinder から再生すると音声ができていて音声の再生も問題なく実行できたが
Cを度ではなくシーとなったり
曇はくも
と発音される

次にファイルをubuntu にコピーして
Ubuntu から docker で実行できるかテスト

scp weather.txt snowpool@192.168.1.69:/home/snowpool/aw10s/

でコピー

Ubuntu へログインし

curl -s -X POST "192.168.1.69:50021/audio_query?speaker=1" --get --data-urlencode text@weather.txt > query.json

curl -s -H "Content-Type: application/json" -X POST -d @query.json "192.168.1.69:50021/synthesis?speaker=1" > test_audio.wav

次にリモートで音声ファイルを再生
Aplayを使うことで音声再生が可能

aplay test_audio.wav

しかし
これだとパソコン本体にログインしていないと再生されない

目的はリモート接続での音声再生またはcronなどでのログインしていない除隊でも音声を再生させること

ラズパイで過去にやったような気がするので検索

https://www.sato-susumu.com/entry/2023/01/06/203541#pygamemixerSoundでwav再生
を参考に
mpg123
で再生

sudo apt install mpg123

でインストール

 mpg123 test_audio.wav

を実行したが

High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
	version 1.29.3; written and copyright by Michael Hipp and others
	free software (LGPL) without any warranty but with best wishes


Terminal control enabled, press 'h' for listing of keys and functions.

Playing MPEG stream 1 of 1: test_audio.wav ...

MPEG 1.0 L I cbr865 44100 stereo
[src/libmpg123/layer1.c:check_balloc():30] error: Illegal bit allocation value.
[src/libmpg123/layer1.c:INT123_do_layer1():228] error: Aborting layer I decoding after step one.
Note: Illegal Audio-MPEG-Header 0xf6fff3ff at offset 5272.
Note: Trying to resync...
Note: Skipped 96 bytes in input.
[src/libmpg123/layer1.c:check_balloc():30] error: Illegal bit allocation value.
[src/libmpg123/layer1.c:INT123_do_layer1():228] error: Aborting layer I decoding after step one.
> 002+612  00:00.01+00:05.32 --- 100=100   0 kb/s  942 B acc  128 clip p+0.000  
MPEG 1.0 L I cbr865 44100 stereo
Note: Illegal Audio-MPEG-Header 0xf6fff7ff at offset 6310.
Note: Trying to resync...
Note: Skipped 922 bytes in input.
[src/libmpg123/layer1.c:check_balloc():30] error: Illegal bit allocation value.
[src/libmpg123/layer1.c:INT123_do_layer1():228] error: Aborting layer I decoding after step one.
> 003+611  00:00.02+00:05.31 --- 100=100   0 kb/s  942 B acc    0 clip p+0.000  
MPEG 1.0 L I cbr865 44100 stereo
Note: Illegal Audio-MPEG-Header 0x6cffcb00 at offset 8174.
Note: Trying to resync...
Note: Skipped 809 bytes in input.

Warning: Big change from first (MPEG version, layer, rate). Frankenstein stream?
> 004+610  00:00.20+00:31.85 --- 100=100   0 kb/s  942 B acc    0 clip p+0.000  
MPEG 2.5 L III cbr144 11025 stereo

Warning: Big change (MPEG version, layer, rate). Frankenstein stream?

というようにバグった

コメントを残す

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