Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us
Notesclub

AmiVoice

livebooks/amivoice/amivoice.livemd

AmiVoice

Mix.install([
  {:kino, "~> 0.12"},
  {:multipart, "~> 0.4"},
  {:req, "~> 0.4"},
  {:vice, "~> 0.1"}
])

認証情報の設定

appkey_input = Kino.Input.password("APPKEY")
auth_part =
  appkey_input
  |> Kino.Input.read()
  |> Multipart.Part.text_field("u")

Kino.nothing()

同期リクエスト

api_endpoint = "https://acp-api.amivoice.com/v1/nolog/recognize"
audio_input = Kino.Input.audio("Audio", format: :wav, sampling_rate: 16_000)
audio_path =
  audio_input
  |> Kino.Input.read()
  |> Map.get(:file_ref)
  |> Kino.Input.file_path()
File.copy!(audio_path, "/tmp/input.wav")
Vice.start()
{:async, worker} = Vice.convert("/tmp/input.wav", "/tmp/input_16b.wav", output_bits: 16)
Vice.status(worker)
audio_content = File.read!("/tmp/input_16b.wav")
audio_part = Multipart.Part.file_content_field("audio", audio_content, "a")
multipart =
  Multipart.new()
  |> Multipart.add_part(auth_part)
  |> Multipart.add_part(Multipart.Part.text_field("-a-general", "d"))
  |> Multipart.add_part(audio_part)

Kino.nothing()
content_length = Multipart.content_length(multipart)
content_type = Multipart.content_type(multipart, "multipart/form-data")

headers = [
  {"Content-Type", content_type},
  {"Content-Length", to_string(content_length)}
]
{:ok, response} = Req.post(api_endpoint, headers: headers, body: Multipart.body_stream(multipart))
response.body