mapboxが提供しているMapBoxSpeechフレームワークを呼び出すAppleScriptです。
mapboxは地図系の各種機能をWeb APIで提供しています。その一環としてGithub上でNatural-sounding text-to-speech Frameworkを提供しており、これをAppleScriptから呼び出してみました。
Github上のサンプルコードでは、AppleScript(Xcode上のプロジェクト)から呼び出すサンプルも掲載されているのですが、通常のScript EditorやScript Debugger上から呼び出す方法は掲載されていませんでした(しかも、サンプルそのままだと動く気配がないんですが、、、)。
# Xcode上で作成したアプリケーションだと、MapboxSpeech.Frameworkが、組み込んだアプリケーション側のInfo.plist内の指定のエントリに書かれているAccess tokenを読み込んでREST APIにアクセスできるとか。単体でAppleScriptからFrameworkを呼び出すような使い方は想定していなかったようです>サンプル
そこで、実際にmapboxにサインアップして、API Key(というか、プロジェクト単位でのToken)を取得、実際にGithub上で公開されているフレームワークをmacOS用にビルドし、通常のAppleScriptから呼び出してみました。
以下のアプレットは実行すると実際に日本語サンプル(たぶん)の文章を読み上げてくれます。実際に本Script(アプレットではなく)をAppleScriptとしてご自分の環境で動かすためには、Frameworkをインストールし、Script Debugger上で動かす(macOS 10.14以降)か、SIPを解除した環境(macOS 10.14以降)でスクリプトエディタ上で実行することになります。その際には、mapboxのWebサイト上でサインアップしてご自分のAccess tokenを取得してください。サインアップすると公開Access tokenを取得できますが、そちらではなく個別のプロジェクトをWebサイト上で作成して(Test AppleScriptとか)、そちらのAccess tokenを利用してください。
–> Download MapboxSpeech.framework(To ~/Library/Frameworks/)
–> mapboxSpeech Sample Run-Only(Code-Signed Executable Applet with Framework)
……で、実際にサンプル文章を読み上げてみたところ、英文なのに英文っぽくない日本語みたいな発音で、ちょっと「ナニコレ?」と思ってしまいましたが、冗談半分で日本語テキストをパラメータに指定してみたら、ちゃんと日本語を読み上げるのでビビりました。
この手のWebサービスで日本語対応はしておらず、英語+ヨーロッパの数カ国語のみサポートというのが普通です。
OS標準のsayコマンドよりも形態素解析が弱いようなので、文節ごとに読点(、)を入れてあげる必要はありますが、それでも日本語のテキストを読み上げてしまうのにはちょっと驚かされました。
AppleScript名:mapboxSpeech Sample.scptd |
— – Created by: Takaaki Naganoya – Created on: 2019/09/27 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "MapboxSpeech" –https://github.com/mapbox/mapbox-speech-swift use framework "AVFoundation" use scripting additions on run set theOptions to current application’s MBSpeechOptions’s alloc() theOptions’s initWithText:"こんにちは、私の名前は、「ながのや」 です。" set speechSynthesizer to current application’s MBSpeechSynthesizer’s alloc()’s initWithAccessToken:"xx.xxX.X_XXxxxxxXXXXXxXxXXxxX" set theURL to speechSynthesizer’s URLForSynthesizingSpeechWithOptions:theOptions set theData to the current application’s NSData’s dataWithContentsOfURL:theURL set aAudioPlayer to current application’s AVAudioPlayer’s alloc()’s initWithData:theData |error|:(missing value) aAudioPlayer’s prepareToPlay() aAudioPlayer’s setNumberOfLoops:0 aAudioPlayer’s setDelegate:me aAudioPlayer’s play() end run –音楽再生の終了のDelegate Methodを取得 on audioPlayerDidFinishPlaying:anAudioplayer successfully:aFlag tell current application to quit end audioPlayerDidFinishPlaying:successfully: |