ios原生文字轉語音
因新項目需求,需要接入類似支付寶收款提示聲----“支付寶到賬xxxx元”,就查看了一些文章,蘋果還是想的很周全,廢話不多說。
首先
在General -> Linked Frameworks and Libraries 中導入 AVFoundation框架
其次
頭文件包含 #import <AVFoundation/AVSpeechSynthesis.h>
AVSpeechSynthesizerDelegate 實現文字轉語音需要代理方法 用來控制聲音,由於我的項目不需要進行控制,所以代理方法暫時不需要,稍後會貼上代理控制的方法,根據項目需求自行設置。
定義一個全局變量(局部也可),如果需要進行暫停,繼續播放等控制操作,定義全局變量
@property(nonatomic,strong) AVSpeechSynthesizer *voice;
.m下創建一個textfield --------- 用來輸入需要轉換的文字 (如果不需要就不創建,直接AVSpeechUtterance初始化的時候添加文字即可 稍後會講到)
創建一個按鈕 ---------用來控制語音的暫停/繼續。(按鈕創建就不用多說了,不會的趕緊買塊豆腐去O(∩_∩)O)
按鈕點擊方法 在實現中需要將按鈕傳過去
[speechaddTarget:selfaction:@selector(speech:)forControlEvents:UIControlEventTouchUpInside];
實現
- (void)speech:(UIButton*)btn
因為要用這個按鈕來判斷點擊狀態 讓她播放或者暫停或者繼續播放
在實現方法中,進行初始化。
如果需要用代理方法控制聲音的暫停/繼續那就需要設置代理,不需要就請忽略
先初始化 後面帶上需要轉換的文字,也就是textField輸入的內容。
接著 我們就可以玩一玩這個語音了
第一個 pitchMultiplier
音調調節 調節範圍 :[0.5 - 2] 默認是:1
第二個 volume
音量調節 調節範圍 :[0-1] 默認是 :1
第三個 tate
語速調節 調節範圍 :[0-1] 0最慢 1 最快
說個題外話 之前一直認為支付寶的提示聲也是轉出來的,後來看到一個視頻,發現我錯了, 支付寶的提示聲 是他們一個員工的聲音錄制的,這個員工是臺灣人,也是支付寶的交互設計師,叫唐啥來著 我記不起來了。日後有機會 可以封裝一個 定制文字轉語音播放的庫,各式各樣的聲音 。。。。扯多了 繼續,
既然是轉語音 那就需要進行語種的設置了
附上 各個語種 如果直接設置 如 “th -TH”放到 設置語種的方法最好就哦啦
"[AVSpeechSynthesisVoice 0x978a0b0] Language: th-TH",
"[AVSpeechSynthesisVoice 0x977a450] Language: pt-BR",
"[AVSpeechSynthesisVoice 0x977a480] Language: sk-SK",
"[AVSpeechSynthesisVoice 0x978ad50] Language: fr-CA",
"[AVSpeechSynthesisVoice 0x978ada0] Language: ro-RO",
"[AVSpeechSynthesisVoice 0x97823f0] Language: no-NO",
"[AVSpeechSynthesisVoice 0x978e7b0] Language: fi-FI",
"[AVSpeechSynthesisVoice 0x978af50] Language: pl-PL",
"[AVSpeechSynthesisVoice 0x978afa0] Language: de-DE",
"[AVSpeechSynthesisVoice 0x978e390] Language: nl-NL",
"[AVSpeechSynthesisVoice 0x978b030] Language: id-ID",
"[AVSpeechSynthesisVoice 0x978b080] Language: tr-TR",
"[AVSpeechSynthesisVoice 0x978b0d0] Language: it-IT",
"[AVSpeechSynthesisVoice 0x978b120] Language: pt-PT",
"[AVSpeechSynthesisVoice 0x978b170] Language: fr-FR",
"[AVSpeechSynthesisVoice 0x978b1c0] Language: ru-RU",
"[AVSpeechSynthesisVoice 0x978b210] Language: es-MX",
"[AVSpeechSynthesisVoice 0x978b2d0] Language: zh-HK",中文(香港)粵語
"[AVSpeechSynthesisVoice 0x978b320] Language: sv-SE",
"[AVSpeechSynthesisVoice 0x978b010] Language: hu-HU",
"[AVSpeechSynthesisVoice 0x978b440] Language: zh-TW",中文(臺灣)
"[AVSpeechSynthesisVoice 0x978b490] Language: es-ES",
"[AVSpeechSynthesisVoice 0x978b4e0] Language: zh-CN",中文(普通話)
"[AVSpeechSynthesisVoice 0x978b530] Language: nl-BE",
"[AVSpeechSynthesisVoice 0x978b580] Language: en-GB",英語(英國)
"[AVSpeechSynthesisVoice 0x978b5d0] Language: ar-SA",
"[AVSpeechSynthesisVoice 0x978b620] Language: ko-KR",
"[AVSpeechSynthesisVoice 0x978b670] Language: cs-CZ",
"[AVSpeechSynthesisVoice 0x978b6c0] Language: en-ZA",
"[AVSpeechSynthesisVoice 0x978aed0] Language: en-AU",
"[AVSpeechSynthesisVoice 0x978af20] Language: da-DK",
"[AVSpeechSynthesisVoice 0x978b810] Language: en-US",英語(美國)
"[AVSpeechSynthesisVoice 0x978b860] Language: en-IE",
"[AVSpeechSynthesisVoice 0x978b8b0] Language: hi-IN",
"[AVSpeechSynthesisVoice 0x978b900] Language: el-GR",
"[AVSpeechSynthesisVoice 0x978b950] Language: ja-JP"
最後 開始 播放 停止播放 這裏就不用代理實現了
[voice speakUtterance:speech]; //開始播放
[voice continueSpeaking]; // 停止播放
[voice pauseSpeakingAtBoundary:AVSpeechBoundaryWord];//暫停
如果想用代理實現的話 方法如下
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didStartSpeechUtterance:(AVSpeechUtterance*)utterance;
//開始
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance*)utterance;
//完成
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didPauseSpeechUtterance:(AVSpeechUtterance*)utterance;
//暫停
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didContinueSpeechUtterance:(AVSpeechUtterance*)utterance;
//恢復
- (void)speechSynthesizer:(AVSpeechSynthesizer*)synthesizer didCancelSpeechUtterance:(AVSpeechUtterance*)utterance;
//取消
這是我git地址 對這些簡單的進行了包裝 大家有空可以去看看https://github.com/FormerMonster/JCVoice 純屬為了方便設置 ,節省開發時間。大家見諒 如若有需要修正的 望指正 。
ios原生文字轉語音