Skip to content

Commit c3dca8a

Browse files
committed
test(examples): add Google audio output repro
1 parent 0e9539f commit c3dca8a

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { google, type GoogleLanguageModelOptions } from '@ai-sdk/google';
2+
import { streamText, type GeneratedAudioFile, type GeneratedFile } from 'ai';
3+
import { saveAudioFile } from '../../lib/save-audio';
4+
import { run } from '../../lib/run';
5+
6+
// `streamText` yields generic file parts, so adapt audio files for the helper.
7+
function toGeneratedAudioFile(file: GeneratedFile): GeneratedAudioFile {
8+
if (!file.mediaType.startsWith('audio/')) {
9+
throw new Error(`Expected audio file, got ${file.mediaType}`);
10+
}
11+
12+
return {
13+
base64: file.base64,
14+
uint8Array: file.uint8Array,
15+
mediaType: file.mediaType,
16+
format:
17+
file.mediaType === 'audio/mpeg' ? 'mp3' : file.mediaType.split('/')[1]!,
18+
};
19+
}
20+
21+
run(async () => {
22+
const result = streamText({
23+
model: google('lyria-3-clip-preview'),
24+
prompt:
25+
'Generate a short upbeat melody with a gentle synth lead and no spoken words.',
26+
providerOptions: {
27+
google: {
28+
responseModalities: ['AUDIO'],
29+
} satisfies GoogleLanguageModelOptions,
30+
},
31+
});
32+
33+
for await (const part of result.fullStream) {
34+
switch (part.type) {
35+
case 'text-delta': {
36+
process.stdout.write(part.text);
37+
break;
38+
}
39+
40+
case 'file': {
41+
console.log(`\nReceived file: ${part.file.mediaType}`);
42+
43+
if (part.file.mediaType.startsWith('audio/')) {
44+
await saveAudioFile(toGeneratedAudioFile(part.file));
45+
}
46+
47+
break;
48+
}
49+
}
50+
}
51+
});

0 commit comments

Comments
 (0)