一分钟学完function*和yield:简单使用和应用场景

本文介绍了ES6中的Generator特性,通过一个简单的代码示例展示了其工作原理,包括如何使用yield和Generator对象。Generator允许异步编程以更同步的方式表达,但在实际应用中可能增加代码复杂性,作者建议除非必要,否则不推荐使用。文章提到了一种可能的使用场景——在步骤条中控制函数执行顺序,作为替代传统状态管理的一种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

众所周知,es6中有一个没人用的新特性,yield+Generator
最近在学习File System Acess API的时候在官方文档中看到了function* 的异步写法,从来没有用过这种写法,去MDN学习了一下

使用方式

废话不多说,直接上代码

function* test(x){
    yield x
    y = yield 2
    yield fun(y)
}

function fun(x){
    return x
}

let a = test(11)

a.next() // {value: 11, done: false}
a.next() // {value: 2, done: false}
a.next(333) // {value: 2, done: false} 结束了
a.next() // {value: undefined, done: true}
a.next() // {value: undefined, done: true}
a.next(123) // {value: undefined, done: true}
a.next(()=>{}) // {value: undefined, done: true}
a.next('asd') // {value: undefined, done: true}

一步一步看
我们通过function* 这种声明方式定义了一个生成器函数,返回一个Generator对象并赋值给a
当我们第一次调用a.next()时,执行了yield x,其实也就是相当于return,返回了{value: 11, done: false}
当我们第二次调用a.next()时,执行了yield 2,返回了{value: 2, done: false}
当我们第三次调用a.next(333)时,执行了y=333和yield fun(y),所以返回了{value: 2, done: false}
如果我们再调用a.next(),因为已经没有yield了,所以不管我们怎么调用,都是返回{value: undefined, done: true}
当然,这是最简单的用法,还有些高端(让人看不懂的 )玩法,就不在此介绍了(我也不会

使用场景

这玩意好像真的没什么大用…
而且写复杂了非常有可能让后续维护这段代码的人看不懂
我想了想,想到一个可能能用到的场景
比方说现在有一个步骤条,通过一次一次的点击依次调用fun1,fun2,fun3方法
正常来说,我们会在state里增加一个参数,去维护一个step,根据step来调用方法
但是我们也可以使用yield来实现

function* doStep(){
     yield fun1()
     yield fun2()
     yield fun3()
}

const myGenerator = doStep()

<Bottom onClick={()=>{myGenerator.next()}}>

总结

不推荐使用,除非你真的想用

我想要实现实时通过麦克风说话,从而识别出不同的说话人,并标识出来(例如有两个人说话,将两个人音频文字用Speaker 00Speaker 01标识),使用FunASR结合pyannote.audio模型,以下是我写的代码(我使用的是conda),我想要在此基础上加 WebSocket 前端,通过前端页面点击"开始录音",允许接通麦克风,之后可直接通过前端页面麦克风直接说话,从而识别出不同的说话人,并将其音频识别出的文字展示在页面中,并标识说明人(例如说话人1、说话人2等),请在文档的基础加上WebSocket 前端,请写出详情的前端代码、路径、样式以及如何启动,以及启动后的结果展示 文档内容: 以下是基于FunASR(语音识别)pyannote.audio(说话人分离)的实时麦克风多说话人识别整方案,提供**Conda**部署方式,包含代码预期运行结果。 ------ ### **一、Conda 部署方案** #### **1. 创建虚拟环境** ```bash conda create -n funasr_pyannote python=3.10 conda activate funasr_pyannote ``` #### **2. 安装FunASR** ```bash pip install -U funasr modelscope torch==2.3.1 # 安装音频处理库 pip install pyaudio ``` #### **3. 安装pyannote.audio** ```bash pip install pyannote.audio # 申请HuggingFace Token(需注册账号) huggingface-cli login # 输入Token ``` > 运行此处后,输入Token,我的HuggingFace的Token为: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 ```bash (funasr_pyannote) D:\FunASR\test4>huggingface-cli login _| _| _| _| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _|_|_|_| _|_| _|_|_| _|_|_|_| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _| _|_|_|_| _| _| _| _|_| _| _|_| _| _| _| _| _| _|_| _|_|_| _|_|_|_| _| _|_|_| _| _| _| _| _| _| _| _| _| _| _|_| _| _| _| _| _| _| _| _| _| _|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| _| _| _|_|_| _|_|_|_| To log in, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens . Token can be pasted using 'Right-Click'. Enter your token (input will not be visible): Add token as git credential? (Y/n) y Token is valid (permission: fineGrained). The token `FunASR` has been saved to C:\Users\HZH\.cache\huggingface\stored_tokens Your token has been saved in your configured git credential helpers (manager). Your token has been saved to C:\Users\HZH\.cache\huggingface\token Login successful. The current active token is: `FunASR` (funasr_pyannote) D:\FunASR\test4>huggingface-cli whoami HZH520520 ``` #### 4.错误解决方法 > (1)若是在运行下述代码,遇到**` 'NoneType' object is not callable`**则表示 **pyannote/speaker-diarization-3.1** 模型访问被拒绝 > > #### . **接受模型使用协议** > > - 访问模型页面并登录 Hugging Face 账号: > - pyannote/speaker-diarization-3.1→ 点击 **"Agree to access"** > - pyannote/segmentation-3.0→ 点击 **"Agree to access"** > - **等待 5 分钟** 让授权生效(Hugging Face 缓存刷新需要时间) ------ ### **二、核心代码(两种环境通用)** ```python from funasr import AutoModel from pyannote.audio import Pipeline import pyaudio import numpy as np import torch import os # 设置镜像源加速下载(可选) os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 替换为其他镜像若下载慢 # 初始化模型 asr_model = AutoModel(model="paraformer-zh", vad_model="fsmn-vad") # 中文识别模型 # 加载pyannote说话人分离模型(关键优化:提示用户输入Token或使用环境变量) try: # 注意:替换以下Token为您的HuggingFace Token(从huggingface-cli login获取) pipeline = Pipeline.from_pretrained( "pyannote/speaker-diarization-3.1", use_auth_token="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" # 替换为您的实际Token ) print("pyannote模型加载成功") except Exception as e: print(f"pyannote模型加载失败: {e}") pipeline = None # 降级处理,避免后续崩溃 # 实时录音参数(每秒处理16000采样点) CHUNK = 16000 # 1秒音频 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 # 初始化麦克风输入流 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("开始实时识别(按Ctrl+C停止)...") try: while True: # 读取1秒音频数据 data = stream.read(CHUNK) audio_np = np.frombuffer(data, dtype=np.int16).astype(np.float32) / 32768.0 # 归一化处理 # FunASR语音识别(优化:增加空音频检查) asr_result = asr_model.generate(input=audio_np, batch_size_s=300) text = asr_result[0]["text"] if asr_result and asr_result[0] else "" # pyannote说话人分离(优化:强化异常处理) speaker = "Unknown" if pipeline is not None: # 模型加载成功时才执行 try: diarization = pipeline({"waveform": torch.from_numpy(audio_np).unsqueeze(0), "sample_rate": RATE}) if diarization: # 避免空diarization speaker = next(diarization.itertracks(yield_label=True))[2] # 提取首个说话人标签 except Exception as e: print(f"说话人分离错误: {e}") else: print("警告:pyannote模型未加载,使用默认说话人标签") # 输出带说话人标识的文本(格式:[Speaker X]: 文本) print(f"[Speaker {speaker}]: {text}") except KeyboardInterrupt: # 清理资源 stream.stop_stream() stream.close() p.terminate() print("识别已停止") ``` ### **三、运行结果预测** ```plaintext [Speaker A]: 大家好,今天会议讨论项目进度。 [Speaker B]: 目前后端开发已成80%。 [Speaker A]: 前端还需要多久? [Speaker C]: 预计下周成联调。 ``` > **说明**: > > - 每1秒输出一次识别结果 > - `Speaker A/B/C`自动区分不同说话人 > - 中文识别准确率 >90%(实测Paraformer模型)
最新发布
07-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值