limura / NovelSpeaker

text speech app for text novel site.
https://limura.github.io/NovelSpeaker/
MIT License
27 stars 5 forks source link

O-ren(拡張) が選択できない場合がある #86

Open limura opened 6 years ago

limura commented 6 years ago

ご意見ご要望フォームより

内容をざっくりと意訳すると、

という事らしい。 なお、手元の端末には iPod touch は無いので同様の症状は確認できなかった。

Willian-Zhang commented 6 years ago

Confirmed

Device

iOS 12.0 (16A5357b)
Model: iPhone 7 Plus (Model 1661, 1784, 1785, 1786)

Env

Question

Is it actually possible to customize the voice that we want to use in app?

limura commented 6 years ago

(日本語ネイティブな方ではなさそうなので機械翻訳で翻訳しやすそうな感じで書きます)

本件については依然として手元での再現ができておらず、対応が難しいです。

最近似たような症状を訴えてきた人が居ました。 その人に次期リリース候補版を使って話者の設定を上書きしてもらったところ、問題が解消したそうです。

方法としては、話者に「O-ren 拡張」を設定してあるバックアップデータを使って話者の設定を上書きしました。その後、"ことせかい"側 では設定を変更せずにそのまま発話させたそうです。発話させた後からは、設定で「O-ren 拡張」を選択することができるようになったそうです。

バックアップデータとしては、以下の内容の JSON file を、".novelspeaker-backup-json" という拡張子で保存し、シェアボタン等で "ことせかい"へコピー することで適用されます。

{
  "data_version" : "1.0.0",
  "misc_settings" : {
    "default_voice_identifier" : "com.apple.ttsbundle.siri_female_ja-JP_premium"
  }
}

上記のバックアップデータを使って直ったという例が1例だけなので、これで直るとは言い切れません。

2018年8月19日(JST)現在、次期リリース候補版はβテスト中です。それほど遠くない未来に Version 1.1.37 としてリリースされるでしょう。

ところで、βテストには以下のURLより参加を申請できます。 早めに試してみたいという場合はβテストへの参加も考慮すると良いかもしれません。 https://limura.github.io/NovelSpeaker/TesterApplicationGuidelines.html

Willian-Zhang commented 6 years ago

文法の気遣いと詳細な説明と速い答えありがとうございます。

この方法失敗したようだした。

理由を試しに探して見ると、こうなります:

(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.siri_female_ja-JP_premium"]
(id) $6 = nil

ちなみに

(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.Kyoko-premium"]
(AVSpeechSynthesisVoice *) $0 = 0x0000000281cebbe0
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.O-Ren-premium"]
(id) $1 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.O-Ren-Siri-premium"]
(id) $2 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.ORenSiri-premium"]
(id) $3 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.ORen-premium"]
(id) $4 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.Oren-premium"]
(id) $5 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.siri_female_ja-JP_premium"]
(id) $6 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.Siri_female_ja-JP_premium"]
(id) $7 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.siri_female_ja-JP-premium"]
(id) $8 = nil
(lldb) p [AVSpeechSynthesisVoice voiceWithIdentifier:@"com.apple.ttsbundle.siri_female_ja-JP"]
(id) $9 = nil

リストに全てログされたら

    NSArray* voiceList = [AVSpeechSynthesisVoice speechVoices];
    for (AVSpeechSynthesisVoice* voice in voiceList) {
        NSLog(@"(%@) %@ : %@", voice.quality == AVSpeechSynthesisVoiceQualityEnhanced ? @"+": @"-", voice.name, voice.identifier);
    }

こうなります:

2018-08-18 17:13:21.240233-0400 NovelSpeaker[2165:757685] === Voices ===
2018-08-18 17:13:21.240326-0400 NovelSpeaker[2165:757685] (-) Maged : com.apple.ttsbundle.Maged-compact
2018-08-18 17:13:21.240352-0400 NovelSpeaker[2165:757685] (-) Zuzana : com.apple.ttsbundle.Zuzana-compact
2018-08-18 17:13:21.240373-0400 NovelSpeaker[2165:757685] (-) Sara : com.apple.ttsbundle.Sara-compact
2018-08-18 17:13:21.240393-0400 NovelSpeaker[2165:757685] (-) Anna : com.apple.ttsbundle.Anna-compact
2018-08-18 17:13:21.240413-0400 NovelSpeaker[2165:757685] (-) Melina : com.apple.ttsbundle.Melina-compact
2018-08-18 17:13:21.240432-0400 NovelSpeaker[2165:757685] (-) Karen : com.apple.ttsbundle.Karen-compact
2018-08-18 17:13:21.240452-0400 NovelSpeaker[2165:757685] (-) Daniel : com.apple.ttsbundle.Daniel-compact
2018-08-18 17:13:21.240471-0400 NovelSpeaker[2165:757685] (-) Moira : com.apple.ttsbundle.Moira-compact
2018-08-18 17:13:21.240491-0400 NovelSpeaker[2165:757685] (+) Samantha (Enhanced) : com.apple.ttsbundle.Samantha-premium
2018-08-18 17:13:21.240562-0400 NovelSpeaker[2165:757685] (-) Fred : com.apple.speech.synthesis.voice.Fred
2018-08-18 17:13:21.240595-0400 NovelSpeaker[2165:757685] (-) Samantha : com.apple.ttsbundle.Samantha-compact
2018-08-18 17:13:21.240630-0400 NovelSpeaker[2165:757685] (-) Tessa : com.apple.ttsbundle.Tessa-compact
2018-08-18 17:13:21.240650-0400 NovelSpeaker[2165:757685] (-) Monica : com.apple.ttsbundle.Monica-compact
2018-08-18 17:13:21.240669-0400 NovelSpeaker[2165:757685] (-) Paulina : com.apple.ttsbundle.Paulina-compact
2018-08-18 17:13:21.240700-0400 NovelSpeaker[2165:757685] (-) Satu : com.apple.ttsbundle.Satu-compact
2018-08-18 17:13:21.240724-0400 NovelSpeaker[2165:757685] (-) Amelie : com.apple.ttsbundle.Amelie-compact
2018-08-18 17:13:21.240742-0400 NovelSpeaker[2165:757685] (-) Thomas : com.apple.ttsbundle.Thomas-compact
2018-08-18 17:13:21.240791-0400 NovelSpeaker[2165:757685] (-) Carmit : com.apple.ttsbundle.Carmit-compact
2018-08-18 17:13:21.240811-0400 NovelSpeaker[2165:757685] (-) Lekha : com.apple.ttsbundle.Lekha-compact
2018-08-18 17:13:21.240830-0400 NovelSpeaker[2165:757685] (-) Mariska : com.apple.ttsbundle.Mariska-compact
2018-08-18 17:13:21.240849-0400 NovelSpeaker[2165:757685] (-) Damayanti : com.apple.ttsbundle.Damayanti-compact
2018-08-18 17:13:21.241759-0400 NovelSpeaker[2165:757685] (-) Alice : com.apple.ttsbundle.Alice-compact
2018-08-18 17:13:21.241783-0400 NovelSpeaker[2165:757685] (+) Kyoko (Enhanced) : com.apple.ttsbundle.Kyoko-premium
2018-08-18 17:13:21.241803-0400 NovelSpeaker[2165:757685] (-) Kyoko : com.apple.ttsbundle.Kyoko-compact
2018-08-18 17:13:21.241822-0400 NovelSpeaker[2165:757685] (-) Yuna : com.apple.ttsbundle.Yuna-compact
2018-08-18 17:13:21.241840-0400 NovelSpeaker[2165:757685] (-) Ellen : com.apple.ttsbundle.Ellen-compact
2018-08-18 17:13:21.241859-0400 NovelSpeaker[2165:757685] (-) Xander : com.apple.ttsbundle.Xander-compact
2018-08-18 17:13:21.241878-0400 NovelSpeaker[2165:757685] (-) Nora : com.apple.ttsbundle.Nora-compact
2018-08-18 17:13:21.241897-0400 NovelSpeaker[2165:757685] (-) Zosia : com.apple.ttsbundle.Zosia-compact
2018-08-18 17:13:21.241915-0400 NovelSpeaker[2165:757685] (-) Luciana : com.apple.ttsbundle.Luciana-compact
2018-08-18 17:13:21.241962-0400 NovelSpeaker[2165:757685] (-) Joana : com.apple.ttsbundle.Joana-compact
2018-08-18 17:13:21.241982-0400 NovelSpeaker[2165:757685] (-) Ioana : com.apple.ttsbundle.Ioana-compact
2018-08-18 17:13:21.242003-0400 NovelSpeaker[2165:757685] (-) Milena : com.apple.ttsbundle.Milena-compact
2018-08-18 17:13:21.242021-0400 NovelSpeaker[2165:757685] (-) Laura : com.apple.ttsbundle.Laura-compact
2018-08-18 17:13:21.242040-0400 NovelSpeaker[2165:757685] (-) Alva : com.apple.ttsbundle.Alva-compact
2018-08-18 17:13:21.242059-0400 NovelSpeaker[2165:757685] (-) Kanya : com.apple.ttsbundle.Kanya-compact
2018-08-18 17:13:21.242077-0400 NovelSpeaker[2165:757685] (-) Yelda : com.apple.ttsbundle.Yelda-compact
2018-08-18 17:13:21.242096-0400 NovelSpeaker[2165:757685] (-) Ting-Ting : com.apple.ttsbundle.Ting-Ting-compact
2018-08-18 17:13:21.242115-0400 NovelSpeaker[2165:757685] (-) Sin-Ji : com.apple.ttsbundle.Sin-Ji-compact
2018-08-18 17:13:21.242134-0400 NovelSpeaker[2165:757685] (-) Mei-Jia : com.apple.ttsbundle.Mei-Jia-compact

Device

iOS 12.0 (16A5357b)
Model: iPhone 7 Plus (Model 1661, 1784, 1785, 1786)

Some lookaround

limura commented 6 years ago

なるほど。

AVSpeechSynthesisVoice::voiceWithIdentifiernil を返すのであれば駄目なのは正しいです。

また、"ことせかい"では、正に AVSpeechSynthesisVoice::speechVoices を使って使用可能な音声のリストを取得しています。 https://github.com/limura/NovelSpeaker/blob/16cb598a40f08088f6f4103e5b0459ba15582a1b/NovelSpeaker/NiftySpeaker.m#L719 また、その関数を"ja_JP"の固定値で利用しています。 https://github.com/limura/NovelSpeaker/blob/16cb598a40f08088f6f4103e5b0459ba15582a1b/NovelSpeaker/DefaultSpeakSettingEditTableViewCell.m#L65

あれ、もしかして、日本語以外の話者で発話させたいというお問い合わせだったのでしょうか? であれば、今の所はできません。必要であれば issue を立てて対応します。

以下の事柄が関係があるかどうかわかりませんが、一応書いておきます。

iOS の言語設定が日本語の場合、日本語のSiriの拡張音声は削除できないようです。 iOS の言語設定を別の言語に変更することで、日本語のSiriの拡張音声について削除するメニューが出てきました。(設定アプリ → 一般 → アクセシビリティ → スピーチ → 声 → 日本語 → Siri(女性)) この辺りの設定を弄ることでSiriの拡張音声がAVSpeechSynthesisVoice::speechVoicesのリストに出てきたり出てこなくなったりを変える事ができるようになるかもしれないですが試していないので自信はありません。

Willian-Zhang commented 6 years ago

日本語以外

あれ、もしかして、日本語以外の話者で発話させたいというお問い合わせだったのでしょうか?

いいえ、AVSpeechSynthesisVoice::voiceWithIdentifier を使た、AVSpeechSynthesisVoice::speechVoices しない理由は 「もしかして、Identifierで強制的にあのSiriのAVSpeechSynthesisVoiceゲットかもしれません。」

Docに調べてれは、問題無さそうでした:

Returns nil if the identifier is invalid, or if the identifier is valid but the voice isn't available on the device.

ちなみに

https://github.com/limura/NovelSpeaker/blob/16cb598a40f08088f6f4103e5b0459ba15582a1b/NovelSpeaker/NiftySpeaker.m#L730-L741 こうならば、O(n)O(1) になります。

+ (BOOL)isValidVoiceIdentifier:(NSString*)targetIdentifier{
    AVSpeechSynthesisVoice* voice = [AVSpeechSynthesisVoice voiceWithIdentifier:targetIdentifier];
    if(voice){
        return YES;
    }
    return NO;
}

もちろん、必要ならは:

        if ([voice.language isEqualToString:@"ja-JP"]) {
            return YES;
        }

音声削除

iOS の言語設定が日本語の場合、日本語のSiriの拡張音声は削除できないようです。

最初にKyoko ダウンロード消し不能とで提出しだ理由は、思考を変えて、AVSpeechSynthesisVoice::speechVoicesのリストに出てではなく、iOS system に default されている AVSpeechSynthesisVoice ゲートされたがた。その方法は、Kyoko音声を削除され、Siriの拡張音声のみ残らせて、"ことせかい" を選択無してつかて行きがったです。

limura commented 6 years ago

おぉ、isValidVoiceIdentifier::targetIdentifier の改良ありがとうございます。 早速適用しておきました。 https://github.com/limura/NovelSpeaker/commit/ca414cac660dc655af3c1d22ab27a4dc952b11e0

Kyokoの音声を削除した目的は、Defaultの音声をSiriの音声にしたかったという事でしょうか。 Defaultの音声は恐らく変更できないと思います。

とはいえ、 「AVSpeechSynthesisVoice::voiceWithIdentifiercom.apple.ttsbundle.siri_female_ja-JP_premium を使うと nil を返す。」 この問題があるのでSiriの音声を使う事はできそうにありません。

残念です。