Mix.install/2関数で、https://hex.pm/ にパブリッシュされていないHexを取り込んでElixirのプログラミングを楽しむ

**今来むと言ひしばかりに長月の有明の月を待ちいでつるかな**


---

Advent Calendar 2022 70日目[^1]の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

[Mix.install/2](https://hexdocs.pm/mix/Mix.html#install/2)関数があります。
[Mix.install/2](https://hexdocs.pm/mix/Mix.html#install/2)関数を使うことで、Mixタスク`mix new`などで[Elixir](https://elixir-lang.org/)プロジェクトを作成しなくても、野良の1ファイル`.exs`でライブラリを使用することができます。

ライブラリは https://hex.pm/ に公開されていないと使えないのでしょうか？
Noです。
パスで指定、リポジトリで指定ができます。



# [Mix.install/2](https://hexdocs.pm/mix/Mix.html#install/2)のドキュメント

https://hexdocs.pm/mix/Mix.html#install/2

[Mix.install/2](https://hexdocs.pm/mix/Mix.html#install/2)のドキュメントを確認してみます。

> Installs and starts dependencies.
The given deps should be in the same format as defined in a regular Mix project. See mix help deps for more information. As a shortcut, an atom can be given as dependency to mean the latest version. In other words, specifying :decimal is the same as {:decimal, ">= 0.0.0"}.


`mix help deps`に記載されている指定方法が可能とのことです。
さっそく使ってみます。

```elixir
    {:foobar, git: "https://github.com/elixir-lang/foobar.git", tag: "0.1"}
    {:foobar, path: "path/to/foobar"}
```

# https://github.com/TORIFUKUKaiou/azure_text_to_speech

私がつくったHexです。
https://hex.pm/
に公開しようとおもってからちょうど1年くらい経ちました。

ちょうどいいのでこのHexを[Mix.install/2](https://hexdocs.pm/mix/Mix.html#install/2)で取り込んで使ってみます。

[Azure](https://azure.microsoft.com/ja-jp/)の[Text to speech](https://azure.microsoft.com/en-us/services/cognitive-services/text-to-speech/) APIのラッパです。
テキストを音声データに変換してくれます。
私はこのAPIを利用して、[Nerves](https://www.nerves-project.org/)で目覚まし時計アプリを作っていますし、使っています。

それはそうと、いい加減、明日にでもHexリリースしようとおもいます。
あ、[Req](https://github.com/wojtekmach/req)で書き直そう。
それからリリースだ〜:rocket::rocket::rocket:

ちなみに私は、[日本マイクロソフト賞④](https://qiita.com/chomado/items/7d1f757f18c5b442fadd#%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E8%B3%9E-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%81%AE-aspnet-core-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B-%E3%82%92%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-torifukukaiou-%E3%81%95%E3%82%93)を受賞したことがあります。

https://www.youtube.com/watch?v=R3o8vR1A9ao

「elixir azure 愛」で検索🔍すると動画があります。
ぜひご笑覧くださいませ。

# プログラム

`text_to_speech.exs`を書いて楽しみます。

```elixir:text_to_speech.exs
Mix.install([{:azure_text_to_speech, github: "TORIFUKUKaiou/azure_text_to_speech"}],
  force: true,
  config: [
    azure_text_to_speech: [region: "eastus", subscription_key: "秘密"]
  ]
)

locale = "ja-JP"
voice_type = "Neural"

voice =
  AzureTextToSpeech.voices_list()
  |> Enum.filter(fn %{"Locale" => l} -> l == locale end)
  |> Enum.filter(fn %{"VoiceType" => vt} -> vt == voice_type end)
  |> Enum.random()

"Hello, world. おはようございます。こんにちは。私は元気です。元気があればなんでもできる。Azureは最高です。"
|> AzureTextToSpeech.ssml(voice)
|> AzureTextToSpeech.to_speech_of_neural_voice()
|> then(&File.write("output.wav", &1))
```

実行は`elixir text_to_speech.exs`です。
実行すると、`output.wav`ファイルができますので、その美声を再生プレイヤーで再生してお楽しみください。

`subscription_key`の取得は以下を参考にしてください。

https://qiita.com/torifukukaiou/items/a253a5afaa30d765a886#%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AD%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95

https://azure.microsoft.com/ja-jp/services/cognitive-services/text-to-speech/

---

# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

この記事は、[Mix.install/2](https://hexdocs.pm/mix/Mix.html#install/2)関数で、https://hex.pm/ にパブリッシュされていないHexの取り込み方を示しました。
`mix help deps`には他にもHexの指定の仕方がいろいろ書いてあります。
ぜひご覧になってください。

:lgtm::lgtm::lgtm: やコメントは、励みになりますし、私はちょっぴりハゲています。

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>



以上です。