Go の「mime」パッケージの不確定性: 信頼するが検証する

WBOY
リリース: 2024-07-29 07:26:13
オリジナル
1101 人が閲覧しました

Indeterminacy of the `mime` Package in Go: Trust But Verify

元々のブログ投稿: https://lazy.bearblog.dev/go-mime-wtf/

背景

ある週末、私は ToDo リストや買い物リストを自動化するために自分用の Telegram ボットを作成することにしました。

アイデアはシンプルです。購入するアイテムのリストをボットに送信すると、片手に携帯電話を持ち、もう一方の手に買い物かごを持った状態で、チェックボックスをオンにできるチェックボックスを含む Web ページが作成されます。

ボットはかなり早く書かれましたが、その後、OpenAI の Whisper モデルを試してみたくなりました。そこで、アプリケーションに音声認識を追加することにしました。

これで、プログラムは次のように動作します:

  • 私はボットに次のような音声メッセージを送信します: 「ジャガイモ 1 キロ、ディル 1 束、キャベツ 1 個、ビール 2 杯買ってください。ああ、キャベツは必要ありません、私たちにはあります。」
  • ボットは音声を認識し、チェックボックスのあるページを作成します。
リーリー

さて、記事について。 go-openai では、openai.AudioRequest 構造体を使用してオーディオを送信できます。これにより、Reader フィールドにオーディオ データ ストリームを指定するか、FilePath フィールドにファイル パスを指定できます。これらのフィールドは相互に排他的だと思っていましたが、オーディオ ストリームを使用する場合でも FilePath を指定する必要があることがわかりました。 API はおそらくこれを使用してストリーム タイプを決定します。

Telegram 側では、MimeType フィールドを持つ tgbotapi.Voice 構造体を受け取ります。音声メッセージの場合は audio/ogg ですが、将来簡単に変更される可能性があります。

したがって、オーディオ ストリームの MIME タイプがわかったので、そこからファイル拡張子を決定し、OpenAI API が不明なファイル タイプについて文句を言わないようにファイル名を作成する必要があります。

もっとシンプルなものは何でしょうか?

コードは簡単そうに見えます:

リーリー

ローカルでテスト - 動作します:

リーリー

クラウドへのデプロイ - 機能しません:

リーリー

ローカルとビルドに使用された CI/CD で Go のバージョンを確認すると、それらは同じです。

本題に入りましょう

MIME パッケージの動作は決定的ではなく、実行時にオペレーティング システムに /etc/mime.types ファイルが存在するかどうかとその内容に依存することが判明しました。

ここで、MIME パッケージは MIME タイプとファイル拡張子のマッピングのランタイム テーブルを読み取ります。

私は本当に真剣です。バイナリをコンパイルし、すべてのテストを実行すると、すべてがうまくいっているように見えますが、このバイナリは、同じ MIME タイプに対して想定されるファイル拡張子を異なる環境で異なる方法で決定します。

修正方法

オーディオ ファイルの既知の MIME タイプとその拡張子を取得し、mime.AddExtensionType を使用して init 関数に手動で追加しましょう。

リーリー

これにより、アプリケーションの動作が、動作するドメイン (私の場合はオーディオ ファイル) に関して決定的になります。

結論

この経験は、Go の物事が必ずしも決定的ではないことを示しました。何かが奇妙に思われる場合は、ためらわずにライブラリのソース コードを調べて、それがどのように実装されているかを確認してください。これにより、長期的には多くの時間とトラブルを節約できます。

以上がGo の「mime」パッケージの不確定性: 信頼するが検証するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!