SFSpeechRecognizerは音声認識の権限を取らなくても利用できる

# 結論
以下の両方を満たす場合には音声認識の権限が不要
- サポートされているLocaleでRecognizerを生成
- `requiresOnDeviceRecognition`をtrueにする
- 言語アセットがインストールされている

# `SFSpeechRecognizer.requestAuthorization()`しなくて良い説
ドキュメントに音声認識の権限取得方法に関する記述はある。

https://developer.apple.com/documentation/speech/asking_permission_to_use_speech_recognition

が...取得しなければならないとは書いてないっぽい。

コードは省略するが、以下設定で音声認識をする場合は`requestAuthorization`しなくても音声認識できた。

- `SFSpeechAudioBufferRecognitionRequest.requiresOnDeviceRecognition`をtrueにする
    - ローカルで音声認識する設定
- on-device recognitionがサポートされている言語を利用かつその言語アセット（後述）がインストール済み
    - `SFSpeechRecognizer.supportedLocales()`でとれるらしい

<details><summary>On-Device音声認識がサポートされている言語</summary><div>

```lldb
(lldb) po SFSpeechRecognizer.supportedLocales()
▿ 63 elements
  ▿ 0 : en-CA (fixed)
    - identifier : "en-CA"
    - kind : "fixed"
  ▿ 1 : pt-BR (fixed)
    - identifier : "pt-BR"
    - kind : "fixed"
  ▿ 2 : da-DK (fixed)
    - identifier : "da-DK"
    - kind : "fixed"
  ▿ 3 : de-DE (fixed)
    - identifier : "de-DE"
    - kind : "fixed"
  ▿ 4 : en-SA (fixed)
    - identifier : "en-SA"
    - kind : "fixed"
  ▿ 5 : wuu-CN (fixed)
    - identifier : "wuu-CN"
    - kind : "fixed"
  ▿ 6 : hu-HU (fixed)
    - identifier : "hu-HU"
    - kind : "fixed"
  ▿ 7 : it-CH (fixed)
    - identifier : "it-CH"
    - kind : "fixed"
  ▿ 8 : zh-HK (fixed)
    - identifier : "zh-HK"
    - kind : "fixed"
  ▿ 9 : en-AU (fixed)
    - identifier : "en-AU"
    - kind : "fixed"
  ▿ 10 : yue-CN (fixed)
    - identifier : "yue-CN"
    - kind : "fixed"
  ▿ 11 : ja-JP (fixed)
    - identifier : "ja-JP"
    - kind : "fixed"
  ▿ 12 : id-ID (fixed)
    - identifier : "id-ID"
    - kind : "fixed"
  ▿ 13 : fr-CH (fixed)
    - identifier : "fr-CH"
    - kind : "fixed"
  ▿ 14 : he-IL (fixed)
    - identifier : "he-IL"
    - kind : "fixed"
  ▿ 15 : de-AT (fixed)
    - identifier : "de-AT"
    - kind : "fixed"
  ▿ 16 : ar-SA (fixed)
    - identifier : "ar-SA"
    - kind : "fixed"
  ▿ 17 : en-ZA (fixed)
    - identifier : "en-ZA"
    - kind : "fixed"
  ▿ 18 : pt-PT (fixed)
    - identifier : "pt-PT"
    - kind : "fixed"
  ▿ 19 : sv-SE (fixed)
    - identifier : "sv-SE"
    - kind : "fixed"
  ▿ 20 : el-GR (fixed)
    - identifier : "el-GR"
    - kind : "fixed"
  ▿ 21 : ca-ES (fixed)
    - identifier : "ca-ES"
    - kind : "fixed"
  ▿ 22 : nl-NL (fixed)
    - identifier : "nl-NL"
    - kind : "fixed"
  ▿ 23 : fr-FR (fixed)
    - identifier : "fr-FR"
    - kind : "fixed"
  ▿ 24 : en-US (fixed)
    - identifier : "en-US"
    - kind : "fixed"
  ▿ 25 : en-ID (fixed)
    - identifier : "en-ID"
    - kind : "fixed"
  ▿ 26 : en-SG (fixed)
    - identifier : "en-SG"
    - kind : "fixed"
  ▿ 27 : th-TH (fixed)
    - identifier : "th-TH"
    - kind : "fixed"
  ▿ 28 : en-AE (fixed)
    - identifier : "en-AE"
    - kind : "fixed"
  ▿ 29 : zh-TW (fixed)
    - identifier : "zh-TW"
    - kind : "fixed"
  ▿ 30 : es-MX (fixed)
    - identifier : "es-MX"
    - kind : "fixed"
  ▿ 31 : en-PH (fixed)
    - identifier : "en-PH"
    - kind : "fixed"
  ▿ 32 : ru-RU (fixed)
    - identifier : "ru-RU"
    - kind : "fixed"
  ▿ 33 : es-US (fixed)
    - identifier : "es-US"
    - kind : "fixed"
  ▿ 34 : nb-NO (fixed)
    - identifier : "nb-NO"
    - kind : "fixed"
  ▿ 35 : sk-SK (fixed)
    - identifier : "sk-SK"
    - kind : "fixed"
  ▿ 36 : es-419 (fixed)
    - identifier : "es-419"
    - kind : "fixed"
  ▿ 37 : en-GB (fixed)
    - identifier : "en-GB"
    - kind : "fixed"
  ▿ 38 : fi-FI (fixed)
    - identifier : "fi-FI"
    - kind : "fixed"
  ▿ 39 : ro-RO (fixed)
    - identifier : "ro-RO"
    - kind : "fixed"
  ▿ 40 : zh-CN (fixed)
    - identifier : "zh-CN"
    - kind : "fixed"
  ▿ 41 : en-IE (fixed)
    - identifier : "en-IE"
    - kind : "fixed"
  ▿ 42 : es-ES (fixed)
    - identifier : "es-ES"
    - kind : "fixed"
  ▿ 43 : en-IN (fixed)
    - identifier : "en-IN"
    - kind : "fixed"
  ▿ 44 : ms-MY (fixed)
    - identifier : "ms-MY"
    - kind : "fixed"
  ▿ 45 : nl-BE (fixed)
    - identifier : "nl-BE"
    - kind : "fixed"
  ▿ 46 : fr-BE (fixed)
    - identifier : "fr-BE"
    - kind : "fixed"
  ▿ 47 : vi-VN (fixed)
    - identifier : "vi-VN"
    - kind : "fixed"
  ▿ 48 : fr-CA (fixed)
    - identifier : "fr-CA"
    - kind : "fixed"
  ▿ 49 : hi-Latn (fixed)
    - identifier : "hi-Latn"
    - kind : "fixed"
  ▿ 50 : uk-UA (fixed)
    - identifier : "uk-UA"
    - kind : "fixed"
  ▿ 51 : ko-KR (fixed)
    - identifier : "ko-KR"
    - kind : "fixed"
  ▿ 52 : es-CL (fixed)
    - identifier : "es-CL"
    - kind : "fixed"
  ▿ 53 : de-CH (fixed)
    - identifier : "de-CH"
    - kind : "fixed"
  ▿ 54 : tr-TR (fixed)
    - identifier : "tr-TR"
    - kind : "fixed"
  ▿ 55 : it-IT (fixed)
    - identifier : "it-IT"
    - kind : "fixed"
  ▿ 56 : hi-IN (fixed)
    - identifier : "hi-IN"
    - kind : "fixed"
  ▿ 57 : en-NZ (fixed)
    - identifier : "en-NZ"
    - kind : "fixed"
  ▿ 58 : cs-CZ (fixed)
    - identifier : "cs-CZ"
    - kind : "fixed"
  ▿ 59 : hr-HR (fixed)
    - identifier : "hr-HR"
    - kind : "fixed"
  ▿ 60 : hi-IN-translit (fixed)
    - identifier : "hi-IN-translit"
    - kind : "fixed"
  ▿ 61 : pl-PL (fixed)
    - identifier : "pl-PL"
    - kind : "fixed"
  ▿ 62 : es-CO (fixed)
    - identifier : "es-CO"
    - kind : "fixed"
```
</div></details>


# 言語アセットのインストール方法
**Hey Siriの設定をする（完了しなくてもいい）**

インターネッツには、その言語のキーボードを入れろとか色々書いてあったけどどれもダメだった
設定を弄った結果、Hey Siriを設定するとインストールされていた...（どこかに書いていて欲しい）

他にも方法があるかもしれないですが、現状これしかわからなかったので、もしご存じの方がいらっしゃればコメントいただけると嬉しいです！


# 音声認識が利用可能かどうかの判定
- `SFSpeechRecognizer.isAvailable`
    - 音声認識を許可している場合は常にtrue
    - ~~音声認識を許可していない場合はsupportsOnDeviceRecognitionと同値~~ falseになる場合もある
    - 非on-deviceの場合、サーバーにデータを送って音声認識するため、言語アセットがなくても音声認識できるので常にtrueになるのだと思われる
- `SFSpeechRecognizer.supportsOnDeviceRecognition`
    - 言語アセットがインストールされていればtrue

isAvailableはon-deviceもしくは非on-deviceのどちらかで音声認識ができるかどうかを返すため、音声認識の権限をとっている場合でon-device音声認識をしたい場合はsupportsOnDeviceRecognitionを見る必要がある。

まとめると、音声認識が利用可能かどうかの確認は以下でできる
- 権限を取らない場合: isAvailableとsupportsOnDeviceRecognitionをチェック
- 権限を取る場合:
    - on-device: supportsOnDeviceRecognitionをチェック
    - 非on-device: SFSpeechRecognizerがinitできれば音声認識できるのでチェック不要


ドキュメントにはこう書いてあり、いつfalseになるのかはわからなかったので、~~今回の件でスッキリした~~ 結局わかっていない...
（どういう場合にtrueでどういう場合にfalseなのか書いて欲しい）
> When the value of this property is true, you may create new speech recognition tasks. When value of this property is false, speech recognition services are not available.

https://developer.apple.com/documentation/speech/sfspeechrecognizer/1649885-isavailable