שיתוף | 'פלאפון מייל' - הגירסא המשופרת של מייל לפלאפון, כולל קבלת ושליחת מיילים דרך הפלאפון, קריינות מקצועית, ועוד...
-
@האדם-החושב זהו, שקישור זה לא עבד לי.
חוששני שצריך דרך גוגל קלאוד, ולכן לא נראה לי שזה כדאי את ההשקעה.
איזה מפתח API הכנסת?function tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) console.log(response) return response.candidates[0].content.parts[0].inlineData.data } function test(){ const text = "בדיקת tts gemini"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const blob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(blob); }ואז הורדת הקובץ מהדרייב והמרה בעזרת ffmpeg
ffmpeg -f s16le -ar 24000 -ac 1 -i test.pcm test.wavצריך למצוא דרך להמיר את זה בגוגל סקריפט.
עריכה:
הצלחתיfunction tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) return response.candidates[0].content.parts[0].inlineData.data } function createWavFromPcm(pcmBytes, sampleRate, numChannels, bitsPerSample) { const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmBytes.length; const fileSize = 44 - 8 + dataSize; const header = []; function pushString(s) { for (let i = 0; i < s.length; i++) header.push(s.charCodeAt(i)); } function pushUint32LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF, (val >> 24) & 0xFF); } function pushUint16LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF); } pushString("RIFF"); pushUint32LE(fileSize); pushString("WAVE"); pushString("fmt "); pushUint32LE(16); pushUint16LE(1); pushUint16LE(numChannels); pushUint32LE(sampleRate); pushUint32LE(byteRate); pushUint16LE(blockAlign); pushUint16LE(bitsPerSample); pushString("data"); pushUint32LE(dataSize); const headerBytes = new Uint8Array(header); const out = new Uint8Array(headerBytes.length + pcmBytes.length); out.set(headerBytes, 0); out.set(pcmBytes, headerBytes.length); return out; } function test(){ const text = "נשלחה אליך הודעת מייל חדשה בתאריך א כסליו תשפו"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const pcmBlob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(pcmBlob); const sampleRate = 24000; const channels = 1; const bits = 16; const wavBytes = createWavFromPcm(pcmBytes, sampleRate, channels, bits); const wavBlob = Utilities.newBlob(wavBytes, 'audio/wav', 'test.wav'); DriveApp.createFile(wavBlob); }אגב, לגבי שליחת מיילים אפשר לשלוח על ידי שלוחת api במקום לקרוא את הymgr בשלוחת קבלת נתונים (יצטרכו לעשות פריסה של הסקריפט ולהוסיף פונקציית doGet ולהשתיק את הודעת אין מענה משרת api.) כך הוא לא יצטרך בכל ריצה לבדוק את הymgr וכך הסקריפט יהיה מהיר יותר.
-
function tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) console.log(response) return response.candidates[0].content.parts[0].inlineData.data } function test(){ const text = "בדיקת tts gemini"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const blob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(blob); }ואז הורדת הקובץ מהדרייב והמרה בעזרת ffmpeg
ffmpeg -f s16le -ar 24000 -ac 1 -i test.pcm test.wavצריך למצוא דרך להמיר את זה בגוגל סקריפט.
עריכה:
הצלחתיfunction tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) return response.candidates[0].content.parts[0].inlineData.data } function createWavFromPcm(pcmBytes, sampleRate, numChannels, bitsPerSample) { const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmBytes.length; const fileSize = 44 - 8 + dataSize; const header = []; function pushString(s) { for (let i = 0; i < s.length; i++) header.push(s.charCodeAt(i)); } function pushUint32LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF, (val >> 24) & 0xFF); } function pushUint16LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF); } pushString("RIFF"); pushUint32LE(fileSize); pushString("WAVE"); pushString("fmt "); pushUint32LE(16); pushUint16LE(1); pushUint16LE(numChannels); pushUint32LE(sampleRate); pushUint32LE(byteRate); pushUint16LE(blockAlign); pushUint16LE(bitsPerSample); pushString("data"); pushUint32LE(dataSize); const headerBytes = new Uint8Array(header); const out = new Uint8Array(headerBytes.length + pcmBytes.length); out.set(headerBytes, 0); out.set(pcmBytes, headerBytes.length); return out; } function test(){ const text = "נשלחה אליך הודעת מייל חדשה בתאריך א כסליו תשפו"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const pcmBlob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(pcmBlob); const sampleRate = 24000; const channels = 1; const bits = 16; const wavBytes = createWavFromPcm(pcmBytes, sampleRate, channels, bits); const wavBlob = Utilities.newBlob(wavBytes, 'audio/wav', 'test.wav'); DriveApp.createFile(wavBlob); }אגב, לגבי שליחת מיילים אפשר לשלוח על ידי שלוחת api במקום לקרוא את הymgr בשלוחת קבלת נתונים (יצטרכו לעשות פריסה של הסקריפט ולהוסיף פונקציית doGet ולהשתיק את הודעת אין מענה משרת api.) כך הוא לא יצטרך בכל ריצה לבדוק את הymgr וכך הסקריפט יהיה מהיר יותר.
משהוא יודע למה זה קורה ?
אולי בגלל הסינון שלי ?
-
משהוא יודע למה זה קורה ?
אולי בגלל הסינון שלי ?
@שקיעות-בלימוד אכן זה בגלל נטפרי שצריך לשלוח פניה
-
@שקיעות-בלימוד אכן זה בגלל נטפרי שצריך לשלוח פניה
@חסיד-פשוט
אין לי בעיה לשלוח רק מה אני צריך לבקש מהם לפתוח ? -
@חסיד-פשוט
אין לי בעיה לשלוח רק מה אני צריך לבקש מהם לפתוח ?@שקיעות-בלימוד שלח להם הסרטות מסך מהקובץ הגדרות
-
@שקיעות-בלימוד שלח להם הסרטות מסך מהקובץ הגדרות
@חסיד-פשוט
וזה ישחרר לכולם או רק לי ? -
@חסיד-פשוט
וזה ישחרר לכולם או רק לי ?@שקיעות-בלימוד רק לך.
-
function tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) console.log(response) return response.candidates[0].content.parts[0].inlineData.data } function test(){ const text = "בדיקת tts gemini"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const blob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(blob); }ואז הורדת הקובץ מהדרייב והמרה בעזרת ffmpeg
ffmpeg -f s16le -ar 24000 -ac 1 -i test.pcm test.wavצריך למצוא דרך להמיר את זה בגוגל סקריפט.
עריכה:
הצלחתיfunction tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) return response.candidates[0].content.parts[0].inlineData.data } function createWavFromPcm(pcmBytes, sampleRate, numChannels, bitsPerSample) { const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmBytes.length; const fileSize = 44 - 8 + dataSize; const header = []; function pushString(s) { for (let i = 0; i < s.length; i++) header.push(s.charCodeAt(i)); } function pushUint32LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF, (val >> 24) & 0xFF); } function pushUint16LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF); } pushString("RIFF"); pushUint32LE(fileSize); pushString("WAVE"); pushString("fmt "); pushUint32LE(16); pushUint16LE(1); pushUint16LE(numChannels); pushUint32LE(sampleRate); pushUint32LE(byteRate); pushUint16LE(blockAlign); pushUint16LE(bitsPerSample); pushString("data"); pushUint32LE(dataSize); const headerBytes = new Uint8Array(header); const out = new Uint8Array(headerBytes.length + pcmBytes.length); out.set(headerBytes, 0); out.set(pcmBytes, headerBytes.length); return out; } function test(){ const text = "נשלחה אליך הודעת מייל חדשה בתאריך א כסליו תשפו"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const pcmBlob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(pcmBlob); const sampleRate = 24000; const channels = 1; const bits = 16; const wavBytes = createWavFromPcm(pcmBytes, sampleRate, channels, bits); const wavBlob = Utilities.newBlob(wavBytes, 'audio/wav', 'test.wav'); DriveApp.createFile(wavBlob); }אגב, לגבי שליחת מיילים אפשר לשלוח על ידי שלוחת api במקום לקרוא את הymgr בשלוחת קבלת נתונים (יצטרכו לעשות פריסה של הסקריפט ולהוסיף פונקציית doGet ולהשתיק את הודעת אין מענה משרת api.) כך הוא לא יצטרך בכל ריצה לבדוק את הymgr וכך הסקריפט יהיה מהיר יותר.
@האדם-החושב כתב בשיתוף | 'פלאפון מייל' - הגירסא המשופרת של מייל לפלאפון, כולל קבלת ושליחת מיילים דרך הפלאפון, קריינות מקצועית, ועוד...:
אגב, לגבי שליחת מיילים אפשר לשלוח על ידי שלוחת api במקום לקרוא את הymgr בשלוחת קבלת נתונים (יצטרכו לעשות פריסה של הסקריפט ולהוסיף פונקציית doGet ולהשתיק את הודעת אין מענה משרת api.) כך הוא לא יצטרך בכל ריצה לבדוק את הymgr וכך הסקריפט יהיה מהיר יותר.
זה מה שעשיתי לפני מספר שנים
לא רציתי לפרסם את זה כי לא הייתי בטוח שזה יהיה פשוט לכולם -
function tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) console.log(response) return response.candidates[0].content.parts[0].inlineData.data } function test(){ const text = "בדיקת tts gemini"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const blob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(blob); }ואז הורדת הקובץ מהדרייב והמרה בעזרת ffmpeg
ffmpeg -f s16le -ar 24000 -ac 1 -i test.pcm test.wavצריך למצוא דרך להמיר את זה בגוגל סקריפט.
עריכה:
הצלחתיfunction tts(text){ const model = "gemini-2.5-flash-preview-tts" const token = "gemini token" const url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${token}` const payload = { contents: [{ parts:[{ text: text }] }], generationConfig: { responseModalities: ["AUDIO"], speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } } }, model: "gemini-2.5-flash-preview-tts", } const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload) } const response = JSON.parse(UrlFetchApp.fetch(url, options)) return response.candidates[0].content.parts[0].inlineData.data } function createWavFromPcm(pcmBytes, sampleRate, numChannels, bitsPerSample) { const byteRate = sampleRate * numChannels * (bitsPerSample / 8); const blockAlign = numChannels * (bitsPerSample / 8); const dataSize = pcmBytes.length; const fileSize = 44 - 8 + dataSize; const header = []; function pushString(s) { for (let i = 0; i < s.length; i++) header.push(s.charCodeAt(i)); } function pushUint32LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF, (val >> 24) & 0xFF); } function pushUint16LE(val) { header.push(val & 0xFF, (val >> 8) & 0xFF); } pushString("RIFF"); pushUint32LE(fileSize); pushString("WAVE"); pushString("fmt "); pushUint32LE(16); pushUint16LE(1); pushUint16LE(numChannels); pushUint32LE(sampleRate); pushUint32LE(byteRate); pushUint16LE(blockAlign); pushUint16LE(bitsPerSample); pushString("data"); pushUint32LE(dataSize); const headerBytes = new Uint8Array(header); const out = new Uint8Array(headerBytes.length + pcmBytes.length); out.set(headerBytes, 0); out.set(pcmBytes, headerBytes.length); return out; } function test(){ const text = "נשלחה אליך הודעת מייל חדשה בתאריך א כסליו תשפו"; const pcmBase64 = tts(text); const pcmBytes = Utilities.base64Decode(pcmBase64); const pcmBlob = Utilities.newBlob(pcmBytes, 'application/octet-stream', 'test.pcm'); DriveApp.createFile(pcmBlob); const sampleRate = 24000; const channels = 1; const bits = 16; const wavBytes = createWavFromPcm(pcmBytes, sampleRate, channels, bits); const wavBlob = Utilities.newBlob(wavBytes, 'audio/wav', 'test.wav'); DriveApp.createFile(wavBlob); }אגב, לגבי שליחת מיילים אפשר לשלוח על ידי שלוחת api במקום לקרוא את הymgr בשלוחת קבלת נתונים (יצטרכו לעשות פריסה של הסקריפט ולהוסיף פונקציית doGet ולהשתיק את הודעת אין מענה משרת api.) כך הוא לא יצטרך בכל ריצה לבדוק את הymgr וכך הסקריפט יהיה מהיר יותר.
@האדם-החושב כתב בשיתוף | 'פלאפון מייל' - הגירסא המשופרת של מייל לפלאפון, כולל קבלת ושליחת מיילים דרך הפלאפון, קריינות מקצועית, ועוד...:
אגב, לגבי שליחת מיילים אפשר לשלוח על ידי שלוחת api במקום לקרוא את הymgr בשלוחת קבלת נתונים (יצטרכו לעשות פריסה של הסקריפט ולהוסיף פונקציית doGet ולהשתיק את הודעת אין מענה משרת api.) כך הוא לא יצטרך בכל ריצה לבדוק את הymgr וכך הסקריפט יהיה מהיר יותר.
ככה עשיתי בהתחלה, אבל זה כבר מסבך את המשתמש הפשוט לפרוס ולהכניס את הקישור, מה גם שיש משתמשים שחסום להם גוגל סקריפט, לכן עברתי לשיטה הזו
ואגב, לא הצלחתי לעשות שלוחת API שתעבוד טוב, כי משום מה אם יש @ בשליחה הוא נדפק
ואגב, זה לוקח לו כחצי שניה לבדוק שאין מייל חדש...
לגבי הTTS אבדוק בעז"ה
עריכה: בדקתי ועובד מצוין!
היום אין לי זמן, אולי במוצ"ש אעשה גירסא חדשה
כמדומה שכדאי שברירת מחדל זה יעבוד עם גוגל קלאוד (זה מהיר פי 10), ורק אם זה נכשל, כמו אם המפתח אינו של גוגל קלאוד זה יעבוד ככה, אשמח לחוות דעתך.
בנתיים יש מעלות לזה ולזה, למשל: בג'מיני אפשר לעשות קולות שונים לכותרות, אבל בגוגל קלאוד אפשר לשלוט על מהירות ההקראה.