[回到版面]
回應模式
名 稱
內 文
附加圖檔[] []
  • 可附加圖檔類型:GIF, JPG, JPEG, PNG, WEBM,瀏覽器才能正常附加圖檔
  • 附加圖檔最大上傳資料量為 3072 KB。
  • 當檔案超過寬 125 像素、高 125 像素時會自動縮小尺寸顯示
  • 目前附加圖檔使用量大小: 198593 KB / 500000 KB
  • 回覆時程式碼縮排會被trim消掉,請善用[code][/code]標色或貼到ideone等網站
  • LaTeX記法可以用「$$」或「\( \)」包起來,例如「$\sum_{k=1}^{k=n} k^2 = \frac{n(n+1)(n+2)}{6}$」
  • 投稿時請點擊畫像認證後,再按下 [送出] 按鈕提交。
  • 鬧板、攻擊性發言、煽動性發言請無視(回應者也無視),並使用del或在貓管理部向管理員回報。
  • 新介面尚處於測試階段,如果有任何問題可以向管理員或於程設交流版反映。

檔名:1560159269102.jpg-(131 KB, 1200x540)
131 KB
UnityWebRequest與播放audio無名19/06/10(一)17:34:29 ID:E93c03..No.13401del
最近在試著用unity寫一個code是,可以接到google小姐的合成語音來播放,大概的code如下方所示
我用unity自己的模擬器去執行是可以正常運作,也能正確播放我想讓程式說的話
但是把他build成手機app,他就會卡在DownloadHandlerAudioClip那段一直沒有回應
想問說這個如果要在手機上執行還需要其他什麼步驟嗎

using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG))
{
yield return www.SendWebRequest();

if (www.isNetworkError)
{
debuglog+= "ERROR_"+www.error+"_";
Debug.Log(www.error);
}
else
{
debuglog+= "download_";
AudioClip myClip = DownloadHandlerAudioClip.GetContent(www);

debuglog+= "downEnd_";
debuglog+= myClip.loadState;
source.clip = myClip;
source.Play();

}
}
無名19/06/10(一)18:39:50 ID:d3SgYK8UNo.13402del
網路權限有開嗎?
無名19/06/10(一)19:03:20 ID:63AE1F2oNo.13403del
>>13402
我用了兩個手機去測,其中一隻android6的我不確定...

不過另外一隻android5的他在安裝的時候就有詢問,有拿到完整網路存取權....但還是不行...
無名19/06/11(二)14:46:21 ID:eZM.LWG2No.13404del
我給他加了個try跟catch才發現,他跳了行錯誤在DownloadHandlerAudioClip...

內容是:
Cannot access the .audioClip property of an aborted DownloadHandlerAudioClip


這意思是說我不能在android上用這個function?
無名19/06/11(二)16:25:37 ID:q9s5Zi7MNo.13405del
>>13404
照字面來看是指下載失敗
你把www.error也印出來貼上來看看
無名19/06/11(二)17:47:28 ID:eZM.LWG2No.13406del
>>13405
HTTP/1.1 429 Too Many Requests

恩...照字面理解是請求太多次?
但是在unity的模擬器上是可以正常運作的....
無名19/06/11(二)18:11:12 ID:q9s5Zi7MNo.13407del
>>13406
你的問題是在 "if(www.isNetworkError)" 這裡只檢查 "networkError" 這個代表的是網路環境的問題(例: 沒連上網)
但是還有另外錯誤檢查一個是"www.isHttpError" 這裡代表的是http回應的狀態碼 網路沒問題但是伺服器回應錯誤

>>但是在unity的模擬器上是可以正常運作的....
>>HTTP/1.1 429 Too Many Requests

這跟模擬器或手機無關
你是不是反覆呼叫太多次結果API金鑰被限制?
無名19/06/11(二)19:27:29 ID:dtHYSANkNo.13408del
>>13407
沒啊...我用模擬器呼叫的次數還比較多...
手機則是從一開始就處在錯誤中...
而且我call的是像這樣的網址
"http://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&q=你好,今天天氣不錯&tl=zh"

沒有金鑰一類的東西
無名19/06/11(二)21:18:56 ID:zxlpgw.oNo.13409del
檔名:1560259136466.png-(74 KB, 468x468)
74 KB
>>13408
之前有看過開發APP的人員用電腦同步手機運作進行開發,要不要試著弄弄看環境?
無名19/06/12(三)09:42:52 ID:xsJMdrpkNo.13410del
>>13409
總覺得用了也不一定能夠找到解決方法啊....


另外,我嘗試不用unity的UnityWebRequest
而改用C#自己的WebRequest可以抓到東西....不過他抓回來的mp3的stream有點難處理....網路上搜尋unity+mp3都說用NAudio...但是這套件要依賴在windows內建的dll上...android沒辦法用...
無名19/06/12(三)14:25:48 ID:cdjIsEKkNo.13411del
>>13410
你再貼一些相關的code吧
只看這幾行真的不知道問題在哪
無名19/06/12(三)15:55:44 ID:xsJMdrpkNo.13412del
>>13411
如果你是說我最上面貼的UnityWebRequest 的方法做的....他其實也就這麼多了啊...
要貼的完整點頂多就是
public AudioSource source;
public void SynthesizeSP()
{

string url = "http://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&q=你好,今天天氣還不錯喔&tl=zh";

source = gameObject.AddComponent<AudioSource>();
StartCoroutine(MP3PlayToGoogle(url));

}
IEnumerator MP3PlayToGoogle(string url)
{

using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG))
{
yield return www.SendWebRequest();

if (www.isNetworkError)
{
updateWord += "ERROR_"+www.error+"_";
Debug.Log(www.error);
}
else
{

updateWord += "download_"+www.error + "_";
try
{
AudioClip myClip = DownloadHandlerAudioClip.GetContent(www);
updateWord += "downEnd_";
updateWord += myClip.loadState;
source.clip = myClip;
source.Play();
}
catch(Exception ex)
{
updateWord += ex.ToString();
}


}
}

}
無名19/06/12(三)16:16:15 ID:Kd65x7v.No.13413del
檔名:1560327375709.png-(42 KB, 940x1100)
42 KB
>>13412
https://stackoverflow.com/questions/51307424/unity-unitywebrequest-is-not-returning-a-value

https://answers.unity.com/questions/1586470/how-do-i-get-into-the-data-returned-from-a-unitywe.html

參考這兩篇,幾點建議(方向?):
1.移除using,因為可能執行時機造成物件已被GC
2.操作回傳資料使用callback的委派
3.source 不要宣告在外面,這是你必須培養的素養
無名19/06/12(三)17:50:23 ID:xsJMdrpkNo.13414del
>>13413
總之我移掉了using...
不過他在build出來的app上還是回傳了HTTP/1.1 429 Too Many Requests

我對UnityWebRequest 的機制也不是很了解,他會出現你call一次卻一次連續傳送要求的狀況嗎
無名19/06/12(三)18:15:00 ID:cdjIsEKkNo.13415del
>>13412
這個觸發時機點是什麼? 觸發幾次?
(按鈕事件/啟動事件..)
無名19/06/12(三)18:15:43 ID:cdjIsEKkNo.13416del
>>13413
你列的這三點跟他的問題一點關係也沒有.....
無名19/06/12(三)19:44:55 ID:OjJTV5C6No.13417del
>>13415
我是做成按紐,有顆按紐按下去就會call最上面的function
無名19/06/12(三)20:26:54 ID:cdjIsEKkNo.13418del
>>13417
看起來是谷哥伺服器的問題
試試看這個
https://stackoverflow.com/questions/32053442/google-translate-tts-api-blocked
(看起來你的網址也有&client=tw-ob)

不行的話
就試試看
在SendWebRequest前面加上
www.SetRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");

或是
www.SetRequestHeader("Referer","http://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&q=%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%BB%8A%E5%A4%A9%E5%A4%A9%E6%B0%A3%E9%82%84%E4%B8%8D%E9%8C%AF%E5%96%94&tl=zh")
無名19/06/13(四)10:43:51 ID:xvg2r6kcNo.13422del
>>13418
感謝,用了第二個方法成功了
無名19/06/13(四)16:13:43 ID:Dk/O8pIgNo.13423del
>>13422
如果你只是練習/個人專案倒是沒關係
若是實際產品建議去弄個正規tts api


【刪除文章】[]
刪除用密碼: