Closed ooyamatakehisa closed 1 year ago
ごめん微妙に動画バグってる(RecordDetailsで認識が進んでも新たなTranscriptionLineが追加されていない)ので修正するけど、コミット数多いからレビューはしていただいて結構です!
バグ修正終わり
@shibukazu このPRのdescriptionにも少し書いたけど、もうモデルのロードとかfreeModelとかすべてDispatchQueue(label: "recognize")
の中にいれていい?そしたら
から色々チェックとかも減りそうだし、認識タスクの実行中にモデルのfreeとかが行われることを防げるし(これ)、
とかも解決できそう?
まあ今そもそもfreeModelされるのってchangeModelでモデル変更するときだけで、今は認識中はモデル変更できないようになってるから、実際大丈夫といえば大丈夫なのか。で、もしこういう変更とかするのをキューに入れるなら、認識中でもモデルを変更できるようにできるな。Viewではモデル変更されたようにして、実際にはモデル変更のタスクはまだキューの中に入ってるみたいなことになって結構ややこしくなるけど。
@shibukazu このPRのdescriptionにも少し書いたけど、もうモデルのロードとかfreeModelとかすべて
DispatchQueue(label: "recognize")
の中にいれていい?そしたら
viewとは並列に動く
認識タスクとは直列にうごく
から色々チェックとかも減りそうだし、認識タスクの実行中にモデルのfreeとかが行われることを防げるし(これ)、
284
とかも解決できそう?
まあ今そもそもfreeModelされるのってchangeModelでモデル変更するときだけで、今は認識中はモデル変更できないようになってるから、実際大丈夫といえば大丈夫なのか。で、もしこういう変更とかするのをキューに入れるなら、認識中でもモデルを変更できるようにできるな。Viewではモデル変更されたようにして、実際にはモデル変更のタスクはまだキューの中に入ってるみたいなことになって結構ややこしくなるけど。
これぜひやってほしいです 認識中でもモデルが(View上では)変更できることに関しては特に問題はないと思います。
ごめん、キューの中にloadとか入れるのはやるけど、前の認識がおわってなくてもモデル変更できるようにするっていうのはやめとくわ。今ってどのモデルが選択されてるかってRecognitionManager.mode
を@Published
にしてることで、ロードされたタイミングで自動的に選択中モデルの表示も変わるようになってるけど、ビュー上だけで変更できるようにするってことはまた色々@State
追加しないといけなさそうで結構めんどくさそうなので...
ごめん、キューの中にloadとか入れるのはやるけど、前の認識がおわってなくてもモデル変更できるようにするっていうのはやめとくわ。今ってどのモデルが選択されてるかって
RecognitionManager.mode
を@Published
にしてることで、ロードされたタイミングで自動的に選択中モデルの表示も変わるようになってるけど、ビュー上だけで変更できるようにするってことはまた色々@State
追加しないといけなさそうで結構めんどくさそうなので...
これってつまり、現状はView上での変更と実際のモデルの変更が結びついちゃってるってことですかね? であれば確かにめんどくさそうなのでキューの中にloadを入れてSequentiallyに実行されることを担保するだけで十分です!!
@shibukazu RecognitionManager
のmodel
プロパティの値がかわったら@published
によってビューの再レンダリングされるから結びついてるといえば結びついてるけど、まあDRYとは言わんけど似たようなどのモデルが選択されてるかみたいな情報をビューにも持たせるのは(上で俺が提案したみたいにビューのモデルの変更と実際のモデルの変更を分けない限りは)冗長な気がするからまあこれでいいかなと個人的には思う。ビューがモデル側(ビジネスロジック側)に依存するのはまあコントローラーがユースケースに依存するのと同じでいいかな的な。
と思ったけど、 #222 と少し関係してるけど、今ってロード自体は非同期で行われてるのに、モデル変更のビューの更新自体は同期的(変更が完了しないと表示は切り替わらない)で、なんかチグハグな気もするし、ロードに時間がかかるようなモデルはやっぱり実際にロードが完了するよりも先にビュー上では変わったほうきもするな。まあFuture Workですね。
とおもったけど、 https://github.com/openly-jp/voiscribe/issues/303#issuecomment-1606023718 ここに書いた通り簡単に対応できた。
Related Issue
107
296
What
https://github.com/openly-jp/voiscribe/assets/44559556/159963de-3d51-4078-b67f-3354013453bc
Recognizerのリファクタリング
RecognitionManager
が各recognizedSpeech
に対応するRecognizer
を保持する。RecognitionManeger
のみを持たせて、各Recognizer
は隠蔽する。かわりに
RecognizerState
でRecognizer
の状態を保持するようにした。コメントにあるように微妙に機能性は違うけど、まあほぼ同じだしいいかなと。streamingRecognize
関数のfeasibilityCheck
を削除recognizedSpeech
を削除するなどの作業をキューの最後に追加することで、認識中に変更対象のrecognizedSpeech
がなくなるといったことが起きなくなるので、feasibilityCheck
の必要がなくなる284 も同様に一番最初にキューの先頭にloadのクロージャーを追加することでUIの描画と並列に裏では認識タスクとは直列にできるのではないかなと思った
recognizingSpeechIds
というリストを書くビューで取り回して、認識中かどうかを判断していたが、そのあたりをRecognitionManager
に委譲_Language
周りのリファクタリングLanguage
->RecognitionLanguage
、モデルの言語を表していたLang
->ModelLanguage
に変更WhisperModel
の引数はモデルの言語を表すLang
型の値を受け取っていたけど、モデル使う側からしたら認識モデルの言語事情(multi
とか)とか知る必要ないと思ったので、引数はRecognitionLanguage
型に変更。RecognitionLanguage
がどのModelLanguage
に対応するかもWhisperModel
内に留められるべき知識だと思ったので。RecognitionLanguage
とModelLanguage
両方がUserDefautlsとかに保存されていたが、ModelLanguage
はRecognitionLanguage
が定まれば決定するものなので、RecognitionLanguage
のみを保存するように変更。Memo
変更が結構大きいのでコミットごとに見たほうがいいかもです。
todo