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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
540
製品の問い合わせ負荷をLLMで解消したい 〜RAGで作る「自社を知っている」チャットボット〜
optim
0
40
AI エージェントシステムの開発を AI で加速させたい!
optim
0
42
既存プロダクトのRSpec カバレッジを 40% から100% にした話
optim
1
94
最近やってよかったデザインシステム運用改善3選
optim
1
360
<install>要素は何ができて、何を変えるのか
optim
1
310
CIでリグレッションテストを実行し継続的に品質を担保する
optim
1
350
Tanstack Startを触ってみての感動
optim
1
340
移行のつらさは誰が引き受けるのか── Vue.js と Next.js を比べて見えたこと
optim
2
340
Other Decks in Programming
See All in Programming
ALB ログから Trace を気合で繋げる技術
fohte
7
880
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
390
自分的「カンファレンスの楽しみ方」
syumai
0
200
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
120
Deep dive into the select statement (GopherCon UK)
jespino
0
170
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
業務時間外もAIに働いてもらう話
colorful12
3
10k
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
300
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
300
Featured
See All Featured
Building Applications with DynamoDB
mza
96
7.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Accessibility Awareness
sabderemane
1
210
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
Believing is Seeing
oripsolob
1
210
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
GraphQLとの向き合い方2022年版
quramy
50
15k
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