「Rork で音声メモアプリを作ったのに、マイクボタンを押しても何も起きない」——こういうケースは、AI 音声アシスタントや録音系アプリを Rork で構築しようとすると一度は経験するはずです。
マイク関連の不具合は、エラーメッセージが出ないまま無音で失敗することが多く、カメラや位置情報よりも原因の特定が難しい傾向があります。カメラ・位置情報のパーミッション問題についてはRork のカメラ・位置情報・通知のパーミッションエラー解決ガイドも合わせて参考にしてください。ここではRork の AI 生成コードでよくある録音不具合を症状ごとに整理し、それぞれの修正方法をコード付きで紹介します。
シミュレーターでは録音は動かない(まずここを確認)
最初に確認したいのは、iOS シミュレーターはマイクをサポートしていないという点です。
Expo Go やシミュレーターで動作確認しようとしても、録音の開始は内部的に失敗します。エラーが表示されないままボタンが動かないように見えることもあり、「コードのバグだ」と疑って深追いしがちです。
// シミュレーターでテストしようとしたとき、このログが出なくても正常
// 実機(TestFlight ビルド)での確認が必須
const { status } = await Audio.requestPermissionsAsync();
console.log('Permission status:', status); // シミュレーターでは'undetermined'のままになることも解決策: マイクを使う機能は必ず実機 + TestFlight ビルドで検証してください。Rork Companion の実機プレビューでも、マイク機能は動作確認できます。
パターン①「録音開始で即クラッシュ or 無音になる」
録音ボタンを押した瞬間にアプリが落ちる、あるいは録音が始まったように見えて音声が取れていない場合、ネイティブ側のパーミッション宣言が不足している可能性が高いです。
iOS — Info.plist の確認
app.json に NSMicrophoneUsageDescription がないと、iOS はマイクへのアクセスを拒否します。エラーも出ずにクラッシュします。
// app.json(または app.config.js)に追加する設定
{
"expo": {
"ios": {
"infoPlist": {
"NSMicrophoneUsageDescription": "音声メモの録音に使用します。"
}
}
}
}Rork の AI がマイク機能を生成しても、この infoPlist の項目を自動追加しないことがあります。生成後に app.json を確認する習慣をつけておくとよいでしょう。
Android — AndroidManifest.xml の確認
Android では RECORD_AUDIO パーミッションが必要です。expo-audio を使う場合は Expo のプラグインが自動追加することが多いですが、念のため確認します。
// app.json の android セクション
{
"expo": {
"android": {
"permissions": ["RECORD_AUDIO", "WRITE_EXTERNAL_STORAGE"]
}
}
}この設定を追加したあとは、EAS Build で新しいビルドを作る必要があります。eas update だけでは Native 側の変更は反映されません。
パターン②「ダイアログは出るが、許可しても録音できない」
ユーザーがマイクを許可したにもかかわらず録音できない場合、Audio モードの設定漏れが原因であることが多いです。
expo-audio(旧 expo-av)では、録音の前に Audio モードを適切に設定しないと、バックグラウンドで別の音声セッションと競合して失敗します。
import { useAudioRecorder, AudioModule, RecordingPresets } from 'expo-audio';
async function startRecording() {
// ★ここが抜けがち: Audio モードを録音用に設定する
await AudioModule.setAudioModeAsync({
allowsRecordingIOS: true, // iOSで録音を許可
playsInSilentModeIOS: true, // サイレントモードでも動作させる
interruptionModeIOS: 'doNotMix', // 他の音声と競合しない
});
const recorder = useAudioRecorder(RecordingPresets.HIGH_QUALITY);
await recorder.record();
}特に allowsRecordingIOS: true を設定しないと、iOS では録音モードに入れず無音になります。Rork の生成コードでこの設定が省略されているケースが実際によくあります。
パターン③「Expo Go では動くが、TestFlight ビルドで動かない」
Expo Go は開発ツールとして多くのパーミッションをあらかじめ持っています。そのため Expo Go では録音できても、実際のビルドでは app.json の設定が必要になります。
加えて、expo-av から expo-audio への移行も確認ポイントです。Expo SDK 51 以降では expo-av の録音 API が非推奨となり、expo-audio が正式パッケージになっています。Rork が古い API で生成した場合、新しい SDK では動作が安定しないことがあります。
# expo-audio が正しくインストールされているか確認
# (Rork の生成コードで expo-av を使っていたら要確認)
npx expo install expo-audioパッケージを変更したあとは EAS Build で再ビルドが必要です。
パターン④「録音は始まるが、途中で止まる or ファイルが壊れる」
録音が始まっても途中で停止したり、保存されたファイルを再生できない場合、状態管理の問題が多いです。
Rork の AI 生成コードでは、録音の開始・停止ロジックが非同期処理になっていない場合があります。
// ❌ 失敗しやすいパターン(非同期を待たない)
const handleStop = () => {
recorder.stop(); // stop() は Promise を返すが await していない
saveRecording(); // stop 完了前に保存しようとして壊れる
};
// ✅ 正しいパターン
const handleStop = async () => {
await recorder.stop(); // 録音の終了を待つ
const uri = recorder.getUri(); // 録音後に URI を取得
if (uri) {
await saveToStorage(uri); // ファイルが確定してから保存
}
};stop() は非同期で、完了する前にファイルを操作しようとすると破損します。生成されたコードで await が抜けていないか確認してみてください。
iOS と Android の挙動の違いを知っておく
マイク周りは iOS と Android で細かな差があります。把握しておくと原因特定が早くなります。
iOS:
- サイレントモードでは録音できない(
playsInSilentModeIOS: trueで解除可能) - バックグラウンドでの録音は Background Modes の設定が別途必要
- 一度「許可しない」を選ぶと、アプリから再度ダイアログを出せない(設定アプリへ誘導が必要)
Android:
RECORD_AUDIOに加えて Android 13 以降は詳細なパーミッションが必要なケースも- バックグラウンド録音はフォアグラウンドサービスが必要
- 機種差(特にファーウェイ・シャオミ)で挙動が変わることがある
「iOS では動いたのに Android では動かない」という場合は、まず RECORD_AUDIO パーミッションの実行時リクエスト処理を確認してみてください。
Rork に正しい録音コードを生成させるプロンプトのコツ
Rork の AI は指示が曖昧だと録音周りのコードを省略することがあります。以下のように具体的に指示するとうまく生成できます。
# 詳しい指定が生成品質を上げる例
「expo-audio を使い、iOS と Android の両方でマイク録音できるコンポーネントを作って。
AudioModule.setAudioModeAsync で allowsRecordingIOS: true を設定し、
パーミッションのリクエストと、許可されなかった場合のエラー表示も含めて。
録音中・停止中のステート管理も async/await で正しく実装して。」
曖昧なプロンプト(「音声を録音するボタンを作って」)だと、パーミッション処理や Audio モード設定が省略されがちです。
また、録音機能を追加した後に「iOS と Android の両方で動作確認したが、以下の問題があった。修正して」と実際のエラーログを貼り付けるのも効果的です。Rork AI はエラーコンテキストがあると修正精度が上がります。
まず今日試せること
もし「録音ボタンを押しても反応がない」という状態なら、次の順番で確認してください。
- シミュレーターを使っているなら実機に切り替える(Rork Companion か TestFlight ビルド)
app.jsonにNSMicrophoneUsageDescriptionがあるか確認する- 録音開始前に
AudioModule.setAudioModeAsync({ allowsRecordingIOS: true })を呼んでいるか確認する stop()がawaitされているか確認する
この4点だけで、マイク不具合の多くは解決できます。音声 AI アプリは Rork の得意分野でもあります。録音機能を活用したAI 音声日記アプリの実装ガイドも参考にしてみてください。ぜひ諦めずに試してみてください。