Goで英語ツイートを音声化するツイッターボットを作った

561f52667f4da5b27bf9e09bedcb7bbc?s=47 Morix
October 24, 2017

 Goで英語ツイートを音声化するツイッターボットを作った

Created by Shota Omori(@morix1500)
2017-10-24 GoビギナーズLT大会!「最近、Go言語始めました」の会

561f52667f4da5b27bf9e09bedcb7bbc?s=128

Morix

October 24, 2017
Tweet

Transcript

  1. Goで英語ツイートを音声化するツイッターボットを作った 2017.10.24 Go言語LT大会!「最近、Go言語始めました」の会 @morix1500

  2. じこしょうかい ・大森翔太(@morix1500) ・株式会社モブキャスト ・インフラエンジニア ・Go歴:2か月くらい? ・技術ブログやってます!  https://blog.haramishio.xyz/

  3. きょうのテーマ ・英語のツイートを音声化するツイッターボットの紹介 ・エラーハンドリングに悩んだ話

  4. 〇〇と学ぶ英語Botというものがある

  5. 英語学習Botのいいところ ・平易な文章であること ・日本語訳とポイントとなる単語の意味が載ってる ・好きなアニメのセリフで学べる

  6. 英語学習Botのよくないところ ・単語がコピペしづらい   ⇒ ツイッタークライアントによると思う ・発音がわからない

  7. ということでBotに英語をしゃべらせた

  8. Botの仕組み GoApp Polly 1. Streaming 2. Get Speech Request 3.

    Get Speech 4. Encode Video 5. Upload Video & Tweet
  9. Amazon Pollyとは ・AWSが提供するテキストから音声化するサービス ・47種類の男女の声と24の言語(日本語含む)に対応 ・機械学習によるなめらかな発音 ・SSML(Speech Sythesis Markup Language)による音声の編集 ・MP3などでダウンロード可能

  10. Twitterに音声ファイルをアップロードするには ・Twitterに音声ファイルをアップロードできない ・じゃあどうすれば? ・音声ファイルを動画化してそれをアップロード

  11. Go言語でどう作ったか ・Twitter Client  ・Anaconda(https://github.com/ChimeraCoder/anaconda ) ・Pollyの操作  ・AWS SDK ・音声の動画化  ・ffmpeg

  12. 完成したのがこちら アニメで学ぶ英語音声bot @km_eng_speech https://twitter.com/km_eng_speech

  13. Botを作るときに悩んだこと ・Go言語でのエラーハンドリングのやり方  ・例外がないからハンドリングどうやれば…

  14. よくあるエラー処理 func main() { if err := something(); err !=

    nil { fmt.Println(err) } }
  15. よくあるエラー処理(複数エラーの場合) var ( Err01 = errors.New("Output Error 01") Err02 =

    errors.New("Output Error 02") ) func main() { err := something() switch err { case Err01: fmt.Println("type is Err01") fmt.Printf("%+v\n", err) case Err02: fmt.Println("type is Err02") fmt.Printf("%+v\n", err) } } エラー定義しといて 返却されたerrで ハンドリングする
  16. この方法の問題点 ・エラーに追加情報を付与できない func hoge() error { return Err01 } func

    something() error { if err := hoge() ; err != nil { return fmt.Errorf("%+v from hoge", err) } return nil } 違うエラー(Err01ではない)になってしまう!
  17. かいけつあん ・pkg/errorsを使用する  https://github.com/pkg/errors

  18. pkg/errorsとは ・元のエラーを変更しない形で、追加情報を付与できる ・エラーのスタックトレースも出力することができる

  19. エラー定義と追加情報の付与 ・エラー定義  Err01 = errors.New(“Output Error 01”) ・追加情報の付与  return errors.Wrap(Err01,

    “from hoge”)
  20. エラー定義と追加情報の付与 import ( "fmt" "github.com/pkg/errors" ) var ( Err01 =

    errors.New("Output Error 01") Err02 = errors.New("Output Error 02") ) func hoge() error { return Err01 } func fuga() error { return Err02 } func something() error { if err := hoge() ; err != nil { return errors.Wrap(err, "from hoge") } if err := fuga() ; err != nil { return errors.Wrap(err, "from fuga") } return nil }
  21. エラー判定 ・エラーの根本原因の呼び出し  errors.Cause(err) err := something() fmt.Println(err) fmt.Println(errors.Cause(err)) --------------------------- from

    hoge: Output Error 01 Output Error 01
  22. エラー判定 func main() { err := something() switch errors.Cause(err) {

    case Err01: fmt.Println("type is Err01") fmt.Printfln(err) fmt.Printf("%+v\n", err) case Err02: fmt.Println("type is Err02") fmt.Println(err) fmt.Printf("%+v\n", err) } }
  23. エラー判定(前ページの出力結果) type is Err01 from hoge: Output Error 01 Output

    Error 01 main.init /home/ubuntu/go/pkg/src/github.com/morix1500/go-error-handling/04.go:9 runtime.main /home/ubuntu/go/current/src/runtime/proc.go:173 runtime.goexit /home/ubuntu/go/current/src/runtime/asm_amd64.s:2337 from hoge main.something /home/ubuntu/go/pkg/src/github.com/morix1500/go-error-handling/04.go:23 main.main /home/ubuntu/go/pkg/src/github.com/morix1500/go-error-handling/04.go:32 runtime.main /home/ubuntu/go/current/src/runtime/proc.go:185 runtime.goexit /home/ubuntu/go/current/src/runtime/asm_amd64.s:2337
  24. まとめ ・複雑なエラーハンドリングは「pkg/errors」がおすすめ ・適切にエラーを処理してユーザに優しいエラーメッセージを! ・スタックトレースで開発者にも優しいエラーメッセージを!

  25. 最後に - Go言語を使ってみた感想 ・作りたいと思ったものがサクッと作れる  srm - 安全なrmコマンド https://github.com/morix1500/srm ruler -

    csv/tsv/ltsvを表形式に表示するコマンド https://github.com/morix1500/ruler ・パッケージが充実しており車輪の再発明をしなくていい ・とにかく読みやすい/書きやすい! ・ワンバイナリで配布できるのは非常に便利 ・どんどんGo言語の使用を進めていきたい!