現在地の天気を音声にする
1日の天気を取得するには座標取得が必要
Google で現在地の緯度経度を調べ
1 2 3 4 5 6 7 8 | 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を
1 | url = "https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude=hourly,minutely&units=metric&lang=ja&appid={API_key}" |
とする
これで詳細な天気は日本語になったけど
天気そのものは英語のまま
辞書を作成してもいいけど
おそらく今後天気を追加していくことになるので
面倒なので
DeepLを使って翻訳する
1 2 3 4 | import deepl auth_key = "取得したDeepLのAPIキー" # Replace with your key translator = deepl.Translator(auth_key) |
あとは
#天気をdeeplで英語から日本語にする
1 2 3 4 5 | weather_japanese = translator.translate_text(weather,target_lang= "JA" ) # 結果の表示 print(f "今日の最高気温: {max_temp}°C" ) print(f "今日の最低気温: {min_temp}°C" ) print(f "天気: {weather_japanese} ({description})" ) |
とすれば
1 2 3 4 | python current_weather.py 今日の最高気温: 11.26°C 今日の最低気温: 3.72°C 天気: 雲 (薄い雲) |
となる
あとはこれをテキストにする
1 2 3 4 5 | # 今日の天気予報をまとめる today_weather_repo = f "今日の天気は{weather_japanese}、予想最高気温は{max_temp}°C、予想最低気温は{min_temp}°C です" # 結果の表示 print(today_weather_repo) |
pythonの場合
テキスト内に変数を入れるなら{変数名}で組み込むことができる
これで文章はできたので
次にdockerで voicevox をバックグランドで起動し
ここへテキストを送り音声を作成する
とりあえず
1 | 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の起動なので
1 | docker pull voicevox /voicevox_engine :cpu-ubuntu20.04-latest |
でコンテナ取得
バックグランドでの起動は
-d オプションをつければいいので
1 | docker run -d -p '192.168.1.69:50021:50021' voicevox /voicevox_engine :cpu-ubuntu20.04-latest |
でバックグランドで起動
次にMac で
1 | echo -h "今日の天気は雲、予想最高気温は11.26°C、予想最低気温は3.72°C です" > weather.txt |
でテキストを作成
一度停電になり停止したため
再度ubuntu の起動と
1 | docker run -d -p '192.168.1.69:50021:50021' voicevox /voicevox_engine :cpu-ubuntu20.04-latest |
で
バックグランドでdocker の起動
再度
1 2 | cat weather.txt -h 今日の天気は雲、予想最高気温は11.26°C、予想最低気温は3.72°C です |
で調べたら
余計なものが入っていた
過去ログを見たら
-n オプションの間違いだった
とりあえずファイルを編集し
1 | curl -s -X POST "192.168.1.69:50021/audio_query?speaker=1" --get --data-urlencode text@weather.txt > query.json |
でJSONファイルを作成
1 | 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 で実行できるかテスト
1 | scp weather.txt snowpool@192.168.1.69: /home/snowpool/aw10s/ |
でコピー
Ubuntu へログインし
1 2 3 | 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を使うことで音声再生が可能
1 | aplay test_audio.wav |
しかし
これだとパソコン本体にログインしていないと再生されない
目的はリモート接続での音声再生またはcronなどでのログインしていない除隊でも音声を再生させること
ラズパイで過去にやったような気がするので検索
https://www.sato-susumu.com/entry/2023/01/06/203541#pygamemixerSoundでwav再生
を参考に
mpg123
で再生
1 | sudo apt install mpg123 |
でインストール
1 | mpg123 test_audio.wav |
を実行したが
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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? |
というようにバグった