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
令和元年にもなって 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
既存プロダクトのRSpec カバレッジを 40% から100% にした話
optim
1
31
最近やってよかったデザインシステム運用改善3選
optim
1
39
<install>要素は何ができて、何を変えるのか
optim
1
24
CIでリグレッションテストを実行し継続的に品質を担保する
optim
1
43
Tanstack Startを触ってみての感動
optim
1
37
移行のつらさは誰が引き受けるのか── Vue.js と Next.js を比べて見えたこと
optim
2
45
Athenaが遅すぎるので Next.js 16の Cache Componentsで倒してみた
optim
1
94
エンジニア2年目から見た RubyKaigi
optim
1
87
Storeに頼りすぎないフロントエンド
optim
1
48
Other Decks in Programming
See All in Programming
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
3.5k
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
280
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
350
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
410
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
190
テーブルをDELETEした
yuzneri
0
110
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
[RVD26] Vibe Architecture en 2040 : Darwin a-t-il (enfin) eu raison des architectes ?
alexandretouret
0
110
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
420
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
180
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
220
Featured
See All Featured
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
420
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The SEO Collaboration Effect
kristinabergwall1
1
510
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
250
Ethics towards AI in product and experience design
skipperchong
2
330
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Building the Perfect Custom Keyboard
takai
2
820
We Have a Design System, Now What?
morganepeng
55
8.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
410
A designer walks into a library…
pauljervisheath
211
24k
My Coaching Mixtape
mlcsv
0
180
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