Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goで英語ツイートを音声化するツイッターボットを作った
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Morix
October 24, 2017
Programming
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goで英語ツイートを音声化するツイッターボットを作った
Created by Shota Omori(@morix1500)
2017-10-24 GoビギナーズLT大会!「最近、Go言語始めました」の会
Morix
October 24, 2017
More Decks by Morix
See All by Morix
AIでAIをテストする - 音声AIエージェントの品質保証戦略
morix1500
1
380
入社後SREチームのミッションや課題の整理をした話
morix1500
1
600
[EC2からKubernetes]楽天ラクマのコンテナ化の歩み
morix1500
24
8.9k
AWS EKSでClusterAutoscalerを使うときはNodeGroupの分け方に気をつけろ!
morix1500
0
1.1k
FirebaseとNetlifyを使ってサーバーレスでサービスを作った話
morix1500
2
3k
オーバーロードで学んだチームマネジメント / Team management learned through overlord
morix1500
1
2.2k
転職をする前にやっておきたいこと / What you want to do before you change your career
morix1500
0
4.1k
自分を強くするためにやってきたこと
morix1500
7
2.7k
個人事業主になりたい!どうやって?調べてみよう!
morix1500
1
460
Other Decks in Programming
See All in Programming
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
180
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
260
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
660
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
110
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
New "Type" system on PicoRuby
pocke
1
970
Oxcを導入して開発体験が向上した話
yug1224
4
320
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
250
dRuby over BLE
makicamel
2
380
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
ラッコキーワード サービス紹介資料
rakko
1
3.7M
Music & Morning Musume
bryan
47
7.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
210
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
A Soul's Torment
seathinner
6
3k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
260
Transcript
Goで英語ツイートを音声化するツイッターボットを作った 2017.10.24 Go言語LT大会!「最近、Go言語始めました」の会 @morix1500
じこしょうかい ・大森翔太(@morix1500) ・株式会社モブキャスト ・インフラエンジニア ・Go歴:2か月くらい? ・技術ブログやってます! https://blog.haramishio.xyz/
きょうのテーマ ・英語のツイートを音声化するツイッターボットの紹介 ・エラーハンドリングに悩んだ話
〇〇と学ぶ英語Botというものがある
英語学習Botのいいところ ・平易な文章であること ・日本語訳とポイントとなる単語の意味が載ってる ・好きなアニメのセリフで学べる
英語学習Botのよくないところ ・単語がコピペしづらい ⇒ ツイッタークライアントによると思う ・発音がわからない
ということでBotに英語をしゃべらせた
Botの仕組み GoApp Polly 1. Streaming 2. Get Speech Request 3.
Get Speech 4. Encode Video 5. Upload Video & Tweet
Amazon Pollyとは ・AWSが提供するテキストから音声化するサービス ・47種類の男女の声と24の言語(日本語含む)に対応 ・機械学習によるなめらかな発音 ・SSML(Speech Sythesis Markup Language)による音声の編集 ・MP3などでダウンロード可能
Twitterに音声ファイルをアップロードするには ・Twitterに音声ファイルをアップロードできない ・じゃあどうすれば? ・音声ファイルを動画化してそれをアップロード
Go言語でどう作ったか ・Twitter Client ・Anaconda(https://github.com/ChimeraCoder/anaconda ) ・Pollyの操作 ・AWS SDK ・音声の動画化 ・ffmpeg
完成したのがこちら アニメで学ぶ英語音声bot @km_eng_speech https://twitter.com/km_eng_speech
Botを作るときに悩んだこと ・Go言語でのエラーハンドリングのやり方 ・例外がないからハンドリングどうやれば…
よくあるエラー処理 func main() { if err := something(); err !=
nil { fmt.Println(err) } }
よくあるエラー処理(複数エラーの場合) 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で ハンドリングする
この方法の問題点 ・エラーに追加情報を付与できない func hoge() error { return Err01 } func
something() error { if err := hoge() ; err != nil { return fmt.Errorf("%+v from hoge", err) } return nil } 違うエラー(Err01ではない)になってしまう!
かいけつあん ・pkg/errorsを使用する https://github.com/pkg/errors
pkg/errorsとは ・元のエラーを変更しない形で、追加情報を付与できる ・エラーのスタックトレースも出力することができる
エラー定義と追加情報の付与 ・エラー定義 Err01 = errors.New(“Output Error 01”) ・追加情報の付与 return errors.Wrap(Err01,
“from hoge”)
エラー定義と追加情報の付与 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 }
エラー判定 ・エラーの根本原因の呼び出し errors.Cause(err) err := something() fmt.Println(err) fmt.Println(errors.Cause(err)) --------------------------- from
hoge: Output Error 01 Output Error 01
エラー判定 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) } }
エラー判定(前ページの出力結果) 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
まとめ ・複雑なエラーハンドリングは「pkg/errors」がおすすめ ・適切にエラーを処理してユーザに優しいエラーメッセージを! ・スタックトレースで開発者にも優しいエラーメッセージを!
最後に - Go言語を使ってみた感想 ・作りたいと思ったものがサクッと作れる srm - 安全なrmコマンド https://github.com/morix1500/srm ruler -
csv/tsv/ltsvを表形式に表示するコマンド https://github.com/morix1500/ruler ・パッケージが充実しており車輪の再発明をしなくていい ・とにかく読みやすい/書きやすい! ・ワンバイナリで配布できるのは非常に便利 ・どんどんGo言語の使用を進めていきたい!