@פלמנמוני
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
test.wav
test.pcm
צריך למצוא דרך להמיר את זה בגוגל סקריפט.
עריכה:
הצלחתי
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 וכך הסקריפט יהיה מהיר יותר.