見出し画像

【IT技術】【Swift】音声を選んで任意の文書を読み上げる

こんにちは。ラフアンドレディ(株)iOS大好き 春蔵です。

SwiftではAVSpeechSynthesizerクラスを用い、任意の文章を読み上げる事ができます。
今回は、その文章読み上げの機能をごサンプルをもとに紹介します。
サンプルコードについては最後にリンクを記載しています。

サンプルの動作

サンプルでは、iOSにセットアップされている音声の一覧から音声を選択し、「話す」ボタンを押下することにより、任意の文章を読み上げます。(「サンプルの文章です」の部分は変更可能)

なお、シミュレータでは音声エンジンがデフォルトでセットアップされていないため、音声の一覧が取得できません。
実機でのテストをお薦めします。


音声の一覧取得

    /// 音声の表示
    func getVoices()->[AVSpeechSynthesisVoice] {
        // 使用可能音声の取得
        let voices = AVSpeechSynthesisVoice.speechVoices()
        
        // 日本語のみ取得
        let jpVoices = voices.filter({$0.language == locale})
        
        // デバッグ用
        for jpVoice in jpVoices {
            print("voice.name:\(jpVoice.name)")
            print("voice.identifier:\(jpVoice.identifier)")
        }
        
        return jpVoices
    }

AVSpeechSynthesisVoice.speechVoices()で使用可能な音声の一覧が取得できます。
取得結果は、全世界の主だった言語に合わせた一覧(英語、スペイン語、フランス語等)が返却されるため、voices.filter({$0.language == locale})で日本語の音声エンジンを抽出しています。

任意の文章で話す

    /// テキスト読上げ
    /// - Parameter text: 対象テキスト
    func speak(_ text:String , voice:AVSpeechSynthesisVoice?){
        // テキストの設定
        let utterance = AVSpeechUtterance.init(string: text)
        // 音声の設定
        utterance.voice = voice
        // 声の高さ(0.5〜2.0)
        utterance.pitchMultiplier = 1
        // 音量(0.0〜1.0)
        utterance.volume = 1
        // 読み上げスピード(0.0〜1.0)
        utterance.rate = 0.5
        // 話す
        synthesizer.speak(utterance)
        // ステータス変更
        self.isSpeaking = true
    }

任意の文章を話す時には、AVSpeechUtterance.init(string: text)で話すテキストの設定、 synthesizer.speak(utterance)で話します。
その際、AVSpeechUtteranceに設定できるパラメータは以下の通りです。

  • voice ・・・ 話す音声の設定

  • pitchMultiplier ・・・ 声の高さ(0.5〜2.0、デフォルト1)

  • volume ・・・  音量(0.0〜1.0、デフォルト1)

  • rate ・・・ 読み上げスピード(0.0〜1.0、デフォルト0.5)


停止、一時停止、再開

AVSpeechSynthesizerに対し、話すの他に以下のコマンドを実行できます。

  • stopSpeaking ・・・ 話すのを停止します。

  • pauseSpeaking ・・・ 話すのを一時停止します。

  • continueSpeaking ・・・ 話すのを一時停止している場合、再開します。

stopSpeaking、pauseSpeakingでは以下のパラメータで停止タイミングを設定できます。

  •  immediate ・・・ 即時停止

  •  word ・・・ 単語単位で話し終わってから停止


話している実行状況に応じコールバックする

AVSpeechSynthesizerDelegateを継承し、delegateをselfに設定する事により話している実行状況に応じコールバックされるメソッドを宣言できます。

class ContentViewModel : NSObject, ObservableObject , AVSpeechSynthesizerDelegate{
・・・
    
    override init(){
        super.init()
・・・
        // Delegate設定
        synthesizer.delegate = self
    }

コールバックされるメソッドは以下の通り

  • func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance:AVSpeechUtterance) ・・・ 開始時

  • func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance:AVSpeechUtterance) ・・・ 終了時 (サンプルで使用)

  • func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance:AVSpeechUtterance) ・・・ 一時停止時

  • func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didContinue utterance:AVSpeechUtterance) ・・・ 再開時

  • func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didCancel utterance:AVSpeechUtterance) ・・・ キャンセル時


コードサンプル

今回紹介したサンプルの全コードです


アプリケーション

今回紹介した音声読上げ機能を利用したiOSアプリです。


今回も最後までお読みいただき有り難うございました!
それでは、楽しいSwiftライフを!


───-- - - - 

フォロー Me!
↓ ↓
Twitter : @RandR_inc

◆───-- - - - 

ラフアンドレディでの採用はこちら ↓ ↓ ↓

ラフアンドレディでは、みんなのびのびと仕事をしています!エンジニアが長く幸せに活躍できる環境で、仲間と楽しく働いてみませんか?

この記事が参加している募集

やってみた

この記事が気に入ったらサポートをしてみませんか?