(req *pb.TTSRequest, results chan []byte)
| 193 | } |
| 194 | |
| 195 | func (q *Qwen3TtsCpp) TTSStream(req *pb.TTSRequest, results chan []byte) error { |
| 196 | defer close(results) |
| 197 | if req.Text == "" { |
| 198 | return fmt.Errorf("qwen3-tts: TTSStream requires text") |
| 199 | } |
| 200 | |
| 201 | streamCbOnce.Do(func() { |
| 202 | streamCbPtr = purego.NewCallback(streamCallback) |
| 203 | }) |
| 204 | |
| 205 | lang, instruct, speaker, refText, ref, s, err := q.resolveRequest(req) |
| 206 | if err != nil { |
| 207 | return err |
| 208 | } |
| 209 | var refPtr unsafe.Pointer |
| 210 | if len(ref) > 0 { |
| 211 | refPtr = unsafe.Pointer(&ref[0]) |
| 212 | } |
| 213 | |
| 214 | // Emit the WAV header first so the HTTP layer gets a self-describing stream. |
| 215 | results <- wavHeader24k() |
| 216 | |
| 217 | streamMu.Lock() |
| 218 | streamChan = results |
| 219 | rc := CppTTSStream(req.Text, lang, instruct, speaker, refPtr, len(ref), refText, |
| 220 | s.seed, s.temperature, s.topK, s.topP, s.repPen, s.maxNew, streamCbPtr, 0) |
| 221 | streamChan = nil |
| 222 | streamMu.Unlock() |
| 223 | runtimeKeepAlive(ref) |
| 224 | |
| 225 | if rc != 0 { |
| 226 | return fmt.Errorf("qwen3-tts: streaming synthesis failed (rc=%d)", rc) |
| 227 | } |
| 228 | return nil |
| 229 | } |
nothing calls this directly
no test coverage detected