はじめに
こんにちは!
今回は、ポートフォリオ用の料理アプリで実装した、食材の栄養素データ取得機能について紹介します。
この機能は、食材の日本語名を英語に翻訳し、その英語名を使ってUSDAのデータベースから栄養素情報を取得するというものです。
実装方法について備忘録として記事を作成しました。
同じような機能を実装したい方の参考になれば幸いです!
また、使用しているAPIは無料で使用が可能です。
※記事の作成には生成AIを活用しています
この実装には日本特有の食材や単位に対応できない問題があります。
下記に文部科学省の食品成分データベースを活用した方法を記載しています。
ぜひ参考にしてください!
目次
1.使用するAPIの概要
2.実装の流れ
3.フロントエンドの実装
4.バックエンドの実装
5.注意点と改善点
6.まとめ
7.参考リンク
使用するAPIの概要
Google Cloud Translation API
Google翻訳APIを使うことで、高精度な翻訳が実現できます。
- 100以上の言語に対応
- リアルタイムでの翻訳が可能
- 月間500,000文字まで無料で使える
- 翻訳の精度が高い
USDA Food Data Central API
USDA(アメリカ農務省)が提供する食品成分データベースのAPIです。
- 8,000以上の食品の詳細な栄養素情報を提供
- カロリー、タンパク質、脂質、炭水化物などの基本栄養素から、ビタミン、ミネラルまで網羅
- RESTful APIとして提供され、簡単に統合可能
実装の流れ
APIキーの取得
まずは、両方のAPIのキーを取得する必要があります
- Google Cloud ConsoleでTranslation APIのAPIキーを取得
- USDA Food Data CentralでAPIキーを取得
実装の全体像
実装の流れはこんな感じです
- 食材の日本語名をGoogle翻訳APIで英語に翻訳
- 翻訳された英語名でUSDAのデータベースを検索
- 検索結果から適切な食品のFDC IDを取得
- FDC IDを使用して詳細な栄養素データを取得
- 取得したデータをアプリケーションの形式に変換]
フロントエンドの実装
翻訳機能の実装(Typescript実装例)
※環境変数やAPIクライアントの説明は除きます
const handleTranslate = async () => {
if (!name) {
setError("材料名を入力してください");
return;
}
setIsTranslating(true);
setError("");
try {
// バックエンドの翻訳APIを呼び出し
const response = await api.get(`/ingredients/translate`, {
params: { name }
});
setEnglishName(response.data.englishName);
} catch (err) {
setError("翻訳に失敗しました");
console.error(err);
} finally {
setIsTranslating(false);
}
};
栄養素データ取得機能の実装(Typescript実装例)
const usdaApi = {
// 食品名で検索してFDC IDを取得
searchUSDAFood: async (foodName: string): Promise<string | null> => {
try {
const response = await axios.get(`${USDA_BASE_URL}/foods/search`, {
params: {
api_key: USDA_API_KEY,
query: foodName,
pageSize: 1
}
});
if (response.data.foods && response.data.foods.length > 0) {
return response.data.foods[0].fdcId;
}
return null;
} catch (error) {
console.error('Error searching USDA food:', error);
throw error;
}
},
// FDC IDを使用して栄養素データを取得
getNutritionData: async (fdcId: string) => {
try {
const response = await axios.get(`${USDA_BASE_URL}/food/${fdcId}`, {
params: {
api_key: USDA_API_KEY
}
});
// 栄養素データの変換
const foodData = response.data;
return {
calories: extractNutrientValue(foodData, 'Energy'),
protein: extractNutrientValue(foodData, 'Protein'),
fat: extractNutrientValue(foodData, 'Total lipid (fat)'),
carbohydrates: extractNutrientValue(foodData, 'Carbohydrate, by difference'),
sugar: extractNutrientValue(foodData, 'Sugars, Total'),
salt: extractNutrientValue(foodData, 'Sodium, Na')
};
} catch (error) {
console.error('Error fetching nutrition data:', error);
throw error;
}
}
};
バックエンドの実装
Google翻訳APIの実装(Go実装例)
func (h *AdminHandler) TranslateIngredientName(c *gin.Context) {
name := c.Query("name")
if name == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "食材名が指定されていません"})
return
}
// Google Cloud Translation APIを使用して翻訳
translatedText, err := h.translationService.Translate(name, "ja", "en")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "翻訳に失敗しました"})
return
}
c.JSON(http.StatusOK, gin.H{
"englishName": translatedText,
})
}
注意点と改善点
翻訳の精度向上
- 食材名の前処理(例:「大さじ1の」などの単位を除去)
- 翻訳結果の検証と修正機能
- よく使う食材の翻訳結果のキャッシュ
栄養素データの取得
- APIのレート制限への対応
- ネットワークエラーの適切な処理
- データが見つからない場合のフォールバック
パフォーマンス最適化
- 翻訳結果のキャッシュ
- 栄養素データのキャッシュ
- 並行リクエストの制御
まとめ
この実装により、以下のメリットが得られます
- ユーザーの入力負担の軽減(日本語で食材を登録するだけで、自動的に英語名と栄養素データを取得)
- 正確な栄養素データの取得(USDAの信頼性の高いデータベースを活用)
- 多言語対応の基盤構築(将来的な機能拡張に対応可能)
実装する際は、以下の点に注意が必要です
- APIキーの適切な管理
- エラーハンドリングの徹底
- ユーザー体験の最適化
- コスト管理(特にGoogle翻訳APIの使用量)
参考リンク
- Google Cloud Translation API Documentation
- USDA Food Data Central API Documentation
- Food Data Central API Key Signup
この記事が、同様の機能を実装する方の参考になれば幸いです!質問やフィードバックがあれば、コメントでお気軽にどうぞ。