
【iOS 27】赤ちゃんのミルクとおむつを話して育児記録の下書きにする機能を作って、iPhone 15 Proで測ってみた
こんにちは。リテールアプリ共創部で事業企画を担当しているかめだです。
前回、赤ちゃんのミルクとおむつを話すだけで、育児記録アプリの下書きにできないかという設計を書きました。授乳やおむつ替えのたびにアプリを開いて種類・量・時刻を打つ手間を、話すだけで下書きにする案です。子どもの健康の記録は家庭の外に出したくない情報なので、音声認識も文字の振り分けも端末の中だけで終える設計にしました。
今回は実際にアプリを組み、iPhone 15 Proの実機で測りました。エンジニアではない私ですが、型を渡す設計だけならどうにか組めました。合成と言い換えの見本で仕組みを事前に試したあと、私が声に出した実物の音声で精度を測ってみました。
先に、前回の仮説への答え
さて、前回の記事で「こうすれば成立する」と書いたことを、実物の音声を使った測定で確かめました。
| 前回の仮説 | 答え |
|---|---|
| 話した内容を、ミルクやおむつなどの記録の項目に、その場で振り分けられる | 振り分けられます。実物の音声で、項目の正答は作りを直したあとで91.7%(44/48)でした |
| AIモデルは、決まった言葉を避けた言い換えも読める | 読めますが、合格線には届きませんでした。言い換えの見本(原稿のまま)で85.7%です |
| 話していない出来事は作らせない | 実物では2回とも0%(0/24)でした。言い換えの見本では9.1%作りました |
| 量やおむつの有無、体温の数字はルールで決める | そのまま実装できました。時の言い方もルールで読み取り、時刻の計算はしていません |
実物の音声では、記録すべき項目の91.7%が正しく入りました。 話していない出来事は、実物で1回も作りませんでした。言い換えの見本は85.7%で、合格ラインの9割に届きませんでした。実物も1回目は87.5%で不合格でしたが、作りを1つ直したところ、2回目は合格しました。
出来事の切れ目と種類はモデルに、数字とおむつの中身はルールに任せた
アプリは、保護者が話した内容を句読点で区切った一節ごとにモデルへ渡します。受け取る型は次のとおりです。
@Generable
struct BabyEvent {
@Guide(description: "出来事の種類。ミルクは粉ミルクや液体ミルク、母乳は直接の授乳、搾乳は搾った母乳を哺乳瓶で飲ませたこと", .anyOf(BabyVocabulary.kinds))
var kind: String
@Guide(description: "ミルク・搾乳で実際に飲んだ量(ml)。作った量ではない。話していなければ nil")
var amountML: Int?
@Guide(description: "母乳で授乳した時間(分)。話していなければ nil")
var minutes: Int?
@Guide(description: "おむつにおしっこがあったか。おむつの出来事でなければ nil")
var pee: Bool?
@Guide(description: "おむつにうんちがあったか。おむつの出来事でなければ nil")
var poo: Bool?
@Guide(description: "体温(℃)。体温の出来事で、数字を話したときだけ。それ以外は nil")
var temperature: Double?
@Guide(description: "いつのことかを表す短い言葉だけを、話したとおりに書く。「さっき」「今」「10分前」「朝7時」など。文を丸ごと書かない。話していなければ nil")
var when: String?
}
種類は決めた候補(ミルク、母乳、搾乳、おむつ、寝た、起きた、体温、離乳食、吐き戻し、お風呂、くすり、その他)から選ばせます。モデルが挙げた出来事ごとに、話全体を見せて「この出来事は話の中にありますか」を、はい・いいえで判定させる呼び出しも別に持たせました。
@Generable
struct EventVerdict {
@Guide(description: "その一節に、その出来事が書かれているか", .anyOf(["はい", "いいえ"]))
var answer: String
}
モデルに任せたのは、出来事の切れ目と種類の判定、そしてその出来事が本当に話の中にあるかの確認です。量、体温の数字、おしっことうんちの有無はルールで決めます。「80しか飲まなかった」は飲んだ量、「37度8分」は37.8度と読むルールで、時の言い方もルールで読み取り、時刻の計算はしていません。医療の判断もさせません。Apple Intelligence でアプリづくりは何が変わるのか(AFM 3の全体像)にあるとおり、受け取る型を先に決めておけば、その型で返ってきます。
どうやって測ったか?
合格ラインは測る前に決めました。記録すべき項目(種類・量・おむつの中身・体温・時の言い方)の9割以上が正しく、話していない出来事を作る割合が1割未満であることです。根拠は、人が直す前提で一から書くより速いかにそろえました。
見本は3種類です。決まった言葉(ミルク、おむつなど)が入った合成の見本10本、決まった言葉を避けた言い換えの見本10本、そして私がiPhoneに向かって実際に声に出した実物5本です。実物の中身は架空の記録です。
音声認識はSFSpeechRecognizer(ja-JP)を使い、requiresOnDeviceRecognitionをtrueにして、端末の中だけで動く認識だけを使いました。1本の音声は1回だけ認識し、同じ書き起こしでモデルを3回呼んで正答率を出しています。
というのも、モデルが本当にルールを上回っているかを確かめるには、同じ入力で比べる必要があります。なので、ルールだけの検証も用意しました。決まった言葉の一覧と数字の取り出し方だけで抜き出す、私が書いた簡単なルールです。同じ入力を、モデルの作りとルールだけの仕組みの両方にかけて比べています。
Macの読み上げ音声(5つの声)で作った音声も参考に認識にかけたところ、ここは意外でした!文字の誤り率(中央値)は合成で23.6%、言い換えで16.7%あり、私の声よりも大幅に崩れました。読み上げ音声は人の声の代わりにならないと分かったので、判断は実物の声(人の声)で行っています。育児の言葉(ミルク、おむつなど)を認識器に渡す設定(contextualStrings)も試してみましたが、実物の書き起こしは1文字も変わらず、使っていません。
言い換えの見本のうち「おっぱい」を含む1本は、アプリ側で「母乳」に言い換えてから渡す作りにしています。それでも1本は3回とも安全のための判定(The model's safety guardrails were triggered.)で止まり、採点から除きました。
実物で測った結果
実物5本(ミルク120mlと吐き戻し、おむつ(おしっこだけ)、朝6時に母乳10分、熱37.2度、夜中の3時に起きてミルク80ml・また寝た)を、各3回、2つの作りで測りました。
1回目(直す前)は、合成と言い換えの見本で合格していた作りのままです。
| 回 | 項目の正答 | 作った出来事 | 判定 |
|---|---|---|---|
| 1回目(直す前) | 42/48 = 87.5% | 0/24 = 0% | 不合格 |
不合格の原因は1件ずつ見て特定しました。この1本には手こずりました。5本目「夜中の3時に起きてミルクを80ミリリットル飲んでまた寝てます」は、音声認識が句読点を打たずに1文にしていました。話を一節ずつ渡す作りなので、3つの出来事が1つの一節に入り、「起きた」を3回とも記録できませんでした。
なので、句読点のない一節を「〜て」「〜で」で切るルールを足しました。前後の両方に出来事の言葉があるときだけ分けます。
2回目(直したあと)は、同じ実物5本、同じ3回で測り直しました。実物を見てから直した作りの数字です。
| 回 | 項目の正答 | 作った出来事 | 判定 |
|---|---|---|---|
| 2回目(直したあと) | 44/48 = 91.7% | 0/24 = 0% | 合格 |
5本目は3回中1回で「起きた」を記録できました。残りの2回は「起きて」の一節を「寝た」と取り違え、後の「また寝てます」と同じ種類として1件にまとめられています。なぜ取り違えたのかは、まだ突き止められていません。話していない出来事は、実物では1回も作りませんでした。モデルが確かめのところで落とした例もあります。「おむつを替えました。おしっこだけでした」から、モデルは一度「寝た」を挙げましたが、確かめのところで「いいえ」になって消えました。
かかった時間は、実物・2回目でモデルの呼び出し中央値9.45秒、音声認識中央値0.25秒でした。9.45秒は、一節ごとの呼び出しと、出来事ごとに話の中にあるかを確かめる呼び出しを合わせた時間です。こんな感じで、話し終えてから下書きが出るまで長い待ちになります。
ルールだけでは、どこまで読めたか?
同じ入力に、決まった言葉で抜き出すルールだけをかけて比べました。
| 見本 | ルールだけ | モデル(2回目の作り) |
|---|---|---|
| 合成の見本(原稿のまま) | 94.3% | 90.5% |
| 言い換えの見本(原稿のまま) | 60.0% | 85.7% |
| 実物(私の声の書き起こし) | 68.8% | 91.7% |
合成の見本は決まった言葉が入っているので、ルールだけで合格してしまいます。ここではモデルの必要を示せません。モデルの必要を示せるのは言い換えと実物で、どちらもモデルがルールを上回りました。
ルールが外した例です。言い換えの見本では「さっき160いった」からミルクを読み取れず、「10時ごろねんねした」は何も読み取れませんでした。実物では「夜中の3時に起きてミルクを80ミリリットル飲んでまた寝てます」から「ミルク 3ml」の1件しか読み取れず、「夜中の3時」の3を量と読み違え、起きた・寝たも落としました。
ルールだけの仕組みは、私が書いた簡単なルールで、言い方に合わせて足せば当たるようになります。ただし保護者の言い方が増えるたびに、ルールを書き足すことになります。なので、言い方が増えても作りを変えずに読めることが、モデルの役割です。
この業務で、Apple Intelligence で輝けるか?
輝けます。実物の音声で記録すべき項目の91.7%が正しく入り、話していない出来事は1回も作りませんでした。ルールだけでは同じ書き起こしから68.8%でした。
モデルは、出来事の切れ目と種類を決めること、そしてその出来事が話の中に本当にあるかを確かめることです。ルールは、量、体温の数字、おしっことうんちの有無、時の言い方です。時刻の計算や医療の判断はさせていません。人が確定するのは、項目ごとに下書きを直すか、そのまま確定するかです。
まだ言えないのは、私以外の声での精度です。実物は私が声に出した5本だけで測っています。所要も9秒台と長く、呼び出しの回数を減らせるかは確かめていません。
次に試すこと
呼び出しの回数を減らす作りを試します。今は一節ごとにモデルを呼び、挙がった出来事ごとに確かめの呼び出しをもう一度しているため、1回の記録で複数回モデルを呼んでいます。
私以外の声も測ります。配偶者の声、聞き取りにくい滑舌、雑音のある部屋での音声認識は測っていません。
実物の件数を増やします。今回の実物は5本だけです。夜間の眠そうな声、赤ちゃんの泣き声が混じる状況も試します。
双子や保育園に見せる記録の様式は、課題仮説の記事どおり今回の範囲に含めていません。iPhone 15 Pro以外の端末、上位機種での再現も見ていません。
よくある質問
ルールだけで十分ではありませんか。
足りません。実物の音声ではルールだけの正答が68.8%、モデルが91.7%でした。ルールは言い方が増えるたびに書き足す必要がありますが、モデルは言い方が増えても作りを変えずに読めます。
所要の9秒台は待たせすぎではありませんか。
長い待ちです。今の作りは一節ごとの呼び出しと確かめの呼び出しを合わせているため回数が多く、次に呼び出しの回数を減らす仕組みを試します。
双子や保育園の様式にも使えますか。
今回の範囲には含めていません。誰の記録かを分ける仕組みや様式の変換は、別に確かめる必要があります。
参考
- Apple Developer Documentation, Foundation Models: https://developer.apple.com/documentation/foundationmodels
- Apple Developer Documentation, SFSpeechRecognitionRequest.requiresOnDeviceRecognition: https://developer.apple.com/documentation/speech/sfspeechrecognitionrequest/requiresondevicerecognition
- Apple公式(WWDC2026): https://developer.apple.com/videos/play/wwdc2026/241/
同じような音声からの情報抜き出しを考えているなら、この測り方をぜひ参考にしてみてください!
では、おつかめ!
--
クラスメソッドでは、既存スマホアプリをFlutterでiOS/Android同時に作り直し、バックエンドはAWSで再構築する「AI駆動アプリリニューアル」を提供しています。現行アプリの仕様読み解きから設計・実装まで生成AIを組み込んだ開発プロセスで進めるため、レガシー化したアプリのリニューアルを短い期間で作り直します。
サービス詳細・お問い合わせはこちら










