Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
令和元年にもなって wavファイルをバイナリエディタで読んだ話とか / read wa...
Search
OPTiM
October 24, 2019
Programming
18k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
令和元年にもなって wavファイルをバイナリエディタで読んだ話とか / read wav binary
OPTiM
October 24, 2019
More Decks by OPTiM
See All by OPTiM
Railsバージョンを4倍にした話
optim
0
440
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
610
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
660
製品の問い合わせ負荷をLLMで解消したい 〜RAGで作る「自社を知っている」チャットボット〜
optim
0
46
AI エージェントシステムの開発を AI で加速させたい!
optim
0
47
既存プロダクトのRSpec カバレッジを 40% から100% にした話
optim
1
150
最近やってよかったデザインシステム運用改善3選
optim
1
440
<install>要素は何ができて、何を変えるのか
optim
1
380
CIでリグレッションテストを実行し継続的に品質を担保する
optim
1
410
Other Decks in Programming
See All in Programming
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
430
Event is what happens
moro
2
850
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1.1k
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
120
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
Next.js: The final boss of Web Performance
guaca
0
270
Performance Optimization With LLMs
xleitix
0
110
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
Workers Cache を知る
syumai
0
370
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.7k
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.9k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
Tell your own story through comics
letsgokoyo
1
1.1k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
380
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Thoughts on Productivity
jonyablonski
76
5.4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Fireside Chat
paigeccino
43
4.1k
A Soul's Torment
seathinner
8
3.8k
Music & Morning Musume
bryan
48
7.4k
So, you think you're a good person
axbom
PRO
2
2.2k
Transcript
Copyright © OPTiM Corp. All Right Reserved. 1 株式会社 OPTiM
R&Dチーム 中村 令和元年にもなって wavファイルをバイナリエディタで読んだ話とか
Copyright © OPTiM Corp. All Right Reserved. 2 中村
(なかむら)@ 2016 .10 ~ • 愛媛県松山市生まれ → 九州工業大学(電子情報工学科)→ OPTiM R&Dチームのエンジニア 学生の頃にやってて役立ったな。と最近思ったこと • 自宅ラックマウント(されてない平積みの)サーバーで遊んだこと • NEC IX2015 ルーターで遊んだこと • Adobe Flash黄金時代に生まれたこと(ActionScriptとの出会い) 自己紹介
Copyright © OPTiM Corp. All Right Reserved. 3 アイスブレイク ところでみなさんは
何の(バイナリ)エディタが好きですか?
Copyright © OPTiM Corp. All Right Reserved. 4 アイスブレイク 私は最近「0xED」派です
https://www.suavetech.com/0xed/0xed.html
Copyright © OPTiM Corp. All Right Reserved. 5 アイスブレイク Visual
Studio Codeでも読めます(読むだけ)
Copyright © OPTiM Corp. All Right Reserved. 6 Copyright ©
OPTiM Corp. All Right Reserved. WAV と CAF 元年にもなってwavファイルをバイナリエディタで読んだ話とか Ep.1
Copyright © OPTiM Corp. All Right Reserved. 7 WAV
( RIFF waveform Audio Format ) • RIFFチャンクとサブチャンクで構成 • 各チャンクの先頭4バイトはチャンク識別子 • RIFF、fmt、data など • fmtチャンク、dataチャンクは必須 • 各チャンクの5バイト目からの4バイトはチャン クサイズ wavファイルの構造 http://soundfile.sapp.org/doc/WaveFormat/
Copyright © OPTiM Corp. All Right Reserved. 8 背景 こういう感じのものを作ってました
iPhone AVAudioEngine AVAudioRecorder APIサーバー 解析サーバー Go製の普通のAPIサーバー ( http.DetectContentType ) 外部のSaaSなど Validation Error
Copyright © OPTiM Corp. All Right Reserved. 9 背景 こういう感じで書いてました
Copyright © OPTiM Corp. All Right Reserved. 10 背景 何が出てきたのか
caffな何か
Copyright © OPTiM Corp. All Right Reserved. 11 背景 caff
? https://developer.apple.com/library/archive/documentation/MusicAudio/Reference/CAFSpec/CAF_overview/CAF_overview.html https://en.wikipedia.org/wiki/Core_Audio_Format Apple Core Audio Format (CAF) • Mac OS X 10.4以降(条件付きで10.3以降)、iOS 5.0以降でサポートされる • ファイルサイズ制限なし • ヘッダのサイズフィールドが未確定でも大丈夫(録音が中断されてヘッダが未ファイナライズでもOK) • チャンネルレイアウトのようなオーディオデータ以外のデータいろいろ格納できる • 様々なフォーマットのラッパーのように振る舞う(コンテナフォーマットに近い) • 「チャンク」の単位で構成され、チャンクヘッダー + データ部で構成される つまり、出てきたものは「caffのコーデックがLinear PCMになってるファイル」
Copyright © OPTiM Corp. All Right Reserved. 12 結論 wavにしたかったら明示しましょう
Copyright © OPTiM Corp. All Right Reserved. 13 ちなみに MediaInfo
先生はちゃんと教えてくれてました… https://mediaarea.net/ja/MediaInfo
Copyright © OPTiM Corp. All Right Reserved. 14 AMR-NB(Narrowband)
• 8000 [Hz] • モノラル 余談 iOS 12.2からiMessageの音声もcaffになった(らしい) https://applech2.com/archives/20190314-imessage-audio-support-opus-in-ios-12-2.html caff(Opus) • 24000 [Hz] • モノラル
Copyright © OPTiM Corp. All Right Reserved. 15 Copyright ©
OPTiM Corp. All Right Reserved. FLLRチャンク 元年にもなってwavファイルをバイナリエディタで読んだ話とか Ep. 2
Copyright © OPTiM Corp. All Right Reserved. 16 背景 こういう感じのものを作ってました(2周目)
iPhone AVAudioEngine AVAudioRecorder APIサーバー 解析サーバー Go製の普通のAPIサーバー + github.com/youpy/go-wav Could’t read meta data
Copyright © OPTiM Corp. All Right Reserved. 17 背景 こういう感じで書いてました
Copyright © OPTiM Corp. All Right Reserved. 18 背景 何が出てきたのか
見慣れない FLLRサブチャンクの 入ったwavファイル
Copyright © OPTiM Corp. All Right Reserved. 19 背景 FLLR
? https://stackoverflow.com/questions/6284651/avaudiorecorder-doesnt-write-out-proper-wav-file-header Apple software often creates WAVE files with a non-standard (but "spec" conformant) • fmtチャンクとdataチャンクの間にFLLRサブチャンクが入る • FLLRチャンクの大きさはデータによって異なるが4KB程度 • wavはRIFFのサブセットのため、サブチャンクが入ることは問題ない • wavのデータ部が44バイト目から始まるような想定で書かれているソフトウェアは正しく動 作しない • dataチャンクの識別子を見つけて、そこをオフセットとしてデータを読む実装でなければならない
Copyright © OPTiM Corp. All Right Reserved. 20 背景 youpy/go-wav
だめでした
Copyright © OPTiM Corp. All Right Reserved. 21 背景 bakape/thumbnailer
を使いました https://github.com/bakape/thumbnailer
Copyright © OPTiM Corp. All Right Reserved. 22 背景 bakape/thumbnailer
いいところ • FFMPEGをバックエンドにしているのでサブチャンクがあってもきちんと読める • FFMPEGが読めるものをすべて読めるようにするには少し手を加える必要あり? • func NewFFContext(rs io.ReadSeeker) (*FFContext, error) • net/httpパッケージのParseMultipartForm()は32MBを超えるデータは一時ファイルへ書き込まれる • io.Readerを受け取れるものの一時ファイルのパスはパッケージ外で見れない • そして大体のFFMPEGをバックエンドにしてる系のContextはファイルパス(String)を引数にとる
Copyright © OPTiM Corp. All Right Reserved. 23 背景 ExtAudioFileWrite()を使うときはご注意を
Copyright © OPTiM Corp. All Right Reserved. 24 Copyright ©
OPTiM Corp. All Right Reserved. AES-CBC と Go と Node.js 元年にもなってwavファイルをバイナリエディタで読んだ話とか Ep.3
Copyright © OPTiM Corp. All Right Reserved. 25 背景 こういう感じのものを作ってました
テキスト Node.js 標準のCrypto() AES暗号化 UTF-8な 一般的なテキスト 外部のSaaSなど 復号化 Not match テキスト Go crypto/cipher
Copyright © OPTiM Corp. All Right Reserved. 26 背景 Q.
Node.jsのcrypt()で AES-CBC-256暗号したテキストを Goのcryptoで復号できる?
Copyright © OPTiM Corp. All Right Reserved. 27 背景 A.
一部実装しないとできません
Copyright © OPTiM Corp. All Right Reserved. 28 AES
• ブロック暗号(指定されたブロック長ごとにデータを暗号化) • ブロックの大きさより小さいデータはパディング(何らかの文字で埋める) • パディング方式はPKCSなど 背景 https://kiririmode.hatenablog.jp/entry/20181014/1539473020 goの crypto/cipher や crypto/aes • パディングが未定義 • 暗号化するとき: ブロックサイズの倍数でないとエラー • 復号化するとき: パディング部分を残したまま出力 実装しましょう
Copyright © OPTiM Corp. All Right Reserved. 29 背景 大きめのOSS見たら実装してました…
https://github.com/hyperledger/fabric-sdk-go
Copyright © OPTiM Corp. All Right Reserved. 30 背景 実装しました
Copyright © OPTiM Corp. All Right Reserved. 31 Copyright ©
OPTiM Corp. All Right Reserved. おわりに
Copyright © OPTiM Corp. All Right Reserved. 32 フォーマット・仕様、そして実装はきちんと確認しましょう(N回目)
• バイナリファイルでも恐れずに • 既存のソースや外部のソースも正しい実装とは限りません • 99%は自分のミスな気が… けっこう泥臭いこともやります • 欲しいデータセットがない → 自分たちで作る • ライブラリに欲しい機能がない → 自分で実装する おわりに 結局新しいことをやるって、こうなるところありますよね
Copyright © OPTiM Corp. All Right Reserved. Copyright © OPTiM
Corp. All Right Reserved. 33