|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function speak(text, voice = undefined) { |
|
|
const utter = new window.SpeechSynthesisUtterance(text); |
|
|
if (voice) { |
|
|
const voices = window.speechSynthesis.getVoices(); |
|
|
const match = voices.find((v) => v.name === voice); |
|
|
if (match) utter.voice = match; |
|
|
} |
|
|
window.speechSynthesis.speak(utter); |
|
|
return true; |
|
|
} |
|
|
|
|
|
export default (input, output) => |
|
|
React.createElement( |
|
|
"div", |
|
|
{ className: "bg-blue-50 border border-blue-200 rounded-lg p-4" }, |
|
|
React.createElement( |
|
|
"div", |
|
|
{ className: "flex items-center mb-2" }, |
|
|
React.createElement( |
|
|
"div", |
|
|
{ |
|
|
className: |
|
|
"w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center mr-3", |
|
|
}, |
|
|
"🔊", |
|
|
), |
|
|
React.createElement( |
|
|
"h3", |
|
|
{ className: "text-blue-900 font-semibold" }, |
|
|
"Speech Synthesis", |
|
|
), |
|
|
), |
|
|
React.createElement( |
|
|
"div", |
|
|
{ className: "text-sm space-y-1" }, |
|
|
React.createElement( |
|
|
"p", |
|
|
{ className: "text-blue-700 font-medium" }, |
|
|
`Speaking: "${input.text || "Unknown text"}"`, |
|
|
), |
|
|
input.voice && |
|
|
React.createElement( |
|
|
"p", |
|
|
{ className: "text-blue-600 text-xs" }, |
|
|
`Voice: ${input.voice}`, |
|
|
), |
|
|
React.createElement( |
|
|
"p", |
|
|
{ className: "text-blue-600 text-xs" }, |
|
|
typeof output === "string" ? output : "Speech completed successfully", |
|
|
), |
|
|
), |
|
|
); |
|
|
|