最近はswiftを触っているリンボクです。
実装手順は大きく2つ、
①ソースコードのコピペ
②音声データ使用の認証を追加
です。
細かい例外処理をしていないので、試しに動かす用としての提供です。
Swiftで音声入力を実装するクラスのソースコード Xcode16 iOS18対応
gitにソースコードをアップしております。
- デフォルトで作られる ContentView.swiftを下記ファイルの内容を全選択してコピーペーストhttps://github.com/KidaiRinboku/Swift-Speech-code/blob/main/ContentView.swift
- 次にSpeechRecognizer.swiftという名前のファイルをContentView.swiftと同じ階層に新規作成
- 作成したSpeechRecognizer.swiftの中身を下記ファイルの内容を全選択してコピーペーストhttps://github.com/KidaiRinboku/Swift-Speech-code/blob/main/SpeechRecognizer.swift
この段階ではコードの準備はできましたが、実行はできません。
また、Canvasのプレビューは音声を扱えずクラッシュするようです。(回避方法は調べてません。シミュレータと実機であれば、後述の認証情報の追加をすればOK)
音声入力の認証を Xcode16 iOS18対応のSwiftで音声入力を実装するクラスのソースコードを読み込んだプロジェクト に追加する
画面左側のファイルツリーで一番上にある、真っ青なxcodeなアイコンのファイルをクリックします。
下記画像でいうと、test_transです。
- 上記のxcodeアイコンなものを開いたら、
- 画面左のTARGETSを、これもxcodeなアイコンのを選択
- 画面中央、infoタブに移動
- Custom iOS Target Propertiesを展開
- 適当なKey列の行を選び、+ - なボタンがでるので + をクリック
- Privacy - Microphone Usage Description を選択
- Value欄に認証時にユーザに見せる文言を追加
- 適当なKey列の行を選び、+ - なボタンがでるので + をクリック
- Privacy - Speech Recognition Usage Description を選択
- Value欄に認証時にユーザに見せる文言を追加
これで実行可能です。
実機またはシミュレータで実行可能かと思います。
Canvasはクラッシュします。(回避方法は特に調べていません)
シミュレータでmacのマイクを使用して Xcode16 iOS18対応のSwiftで音声入力を実装するクラスのソースコードを読み込んだプロジェクト を 試す方法
シミュレータが起動している状態で、
一番上のアップルマークがあるバーで、
I/O > Audio Input > macbookのマイク
呼び出し方 音声入力を実装するクラスのソースコード Xcode16 iOS18対応
Content Viewから、
startRecording(使いたい言語コード) で呼び出します。
gitのContent Viewでは下記の部分で音声入力を呼び出しています。
speechRecognizer.startRecording(language: selectedLanguage)
注意点など 音声入力を実装するクラスのソースコード Xcode16 iOS18対応
音声入力を検知すると、下記のループが回ります。
recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest) { result, error in }
ループの中で、下記のテキストが受け付けている音声でリアルテイムで更新されます。
「こんにちは」としゃべると「こ」「こん」「こんにち」「こんにちは」とループしながらテキストを完成させていく挙動です。
result.bestTranscription.formattedString
音声を検知しなくなると、ループはピタっととまります。
しばらく沈黙ののち、再度しゃべると、
result.bestTranscription.formattedString
このテキストは沈黙前のテキストを保持せずに、入力を再び受け付けます。
私がswiftを理解できていないのもありますが、「黙るとループがピタッと止まるため、ループないでのブランクチェックやフラグチェックはできない」「ループごとにテキストが変わりまくるので前後比較はできない」「非同期処理を増やしすぎると変化が激しすぎてその後の同期がむずかしい」。
ということがあり、今回のソースコードは音声入力のループごとにタイマー変数をリセットして、タイマー変数が指定の秒数たったら音声入力情報を確定して、録音を再開しています。
アプリの特性に合わせてカスタマイズして使おうかと思います。
コメント