Subscribe的ctx应该集成自Session的ctx

func NewSession(callback Callback) *Session {
	ctx, cancel := context.WithCancel(context.Background())
	g, ctx := errgroup.WithContext(ctx) //  关键:绑定 context
	s := &Session{
		ctx:    ctx,
		cancel: cancel,
		g:      g,
		bus:    eventbus.NewBus(1024),
		output: make(chan SessionMessage, 32),
		ttsEnabled: false,
		consumers:  make(map[SessionName]*Consumer),
		callback: callback,
	}
	// go s.runPipeline()
	return s
}
func (b *Bus) Subscribe(ctx context.Context, types ...EventType) (*Subscriber, func()) {
	ctx, cancel := context.WithCancel(ctx)
	g, ctx := errgroup.WithContext(ctx)
	....

ws 模型关闭连接

	for {
		select {
		case <-ctx.Done():
			syn.conn.Close()
			log.Println("Context done, exiting tts warp readLoop.")
			return nil
		case message, ok := <-l.ch:
			if !ok {
				log.Println("TTSStream event channel closed")
				return nil
			}
func (s *SpeechSynthesizer) readLoop() error {
	defer func() {
		close(s.closed)
		log.Println("SpeechSynthesizer readLoop exited")
	}()
	for {
		if s.conn == nil {
			return nil
		}