赞
踩
现实世界,人跟人的沟通相当一部分是语音沟通,比如打电话,聊天中发送语音消息。
而在程序的世界,大部分以处理字符串为主。
所以,把语音转换成文字就成为了编程世界非常普遍的需求。
Whisper 是由 OpenAI 开发的一种高效的语音识别(ASR)技术,旨在将人类的语音转换成文本。
该模型通过大量的语音数据训练而成,能够识别并转写多种语言和方言中的语音。
以下是 Whisper 的一些主要使用场景和它能解决的问题:
我当前从事的领域为全球客服,应用场景主要是:
内容分析:
客服管理人员快捷查看语言转成的文本内容,把数据喂给AI,进行服务质量评估和概要提取,方便对客服人员客观评价,方便管理。
语音助手和聊天机器人:
主流需求是小客户希望提供AI机器人+少量真人客服,即聊天机器人服务。
通过这些使用场景和解决的问题可以看出,Whisper 作为一个先进的语音识别技术,能够在多个领域带来实质性的改进和便利。
全球客服业务场景下要解决的问题主要有:
多语言和方言的识别:
我们提供了多语种的客服,每个语种其实也有方言的差别,比如英语分美式英语和中式英语,还有各种俚语。
嘈杂环境下的语音识别:
客服客人的语音沟通可能在弱网环境或者噪音环境,需要提高准确度。
节省时间和成本:
如何评估客服的工作质量,提高管理水平,提高甲方的满意度,以前是靠抽查录音,现在是借助转文本+AI检查和概要提取,节约了大量的时间。
假设你在做一个全球客服平台,解决客服服务过程中的问题,提高他们的效率和智能化。那么语音转文本的能力也是标配的。
概括一下,我们期望使用语音转文本达成哪些业务目标。
提高科学评估客服服务质量的效率。
提高客服的服务质量,通过积累的语音转换的文字,识别客人的意图,情绪,提供辅助。
AI语音客服+少量真人客服,是现在小微客户的普遍诉求。
在选定whisper之前,我也对比了开源和商用的各种解决方案。
以下是对比维度的表格概览:
然后要提到的要点就是,转文服务需要GPU, 在云计算厂商购买含有GPU的服务器,最便宜一个月都要4000一个月起。
我们有分公司在海外,比如美国,有自建机房,可以自行购买高配置显卡,搭建服务器,
这块费用相比于云厂商来说有优势。就是程序的安装,维护,对接需要时间去设计,开发,调试。
项目中现在落地实践的是whisper, 一个语音转文本的组件。
whisper 音译: 耳语
定位: 基于大规模弱监督的鲁棒语音识别
鲁棒解释一下: 在IT行业中,“鲁棒性”(Robustness)通常指的是一个系统、网络、软件或硬件在面对错误输入、异常条件或某些意外状况下仍能保持其功能和性能的能力。
鲁棒性强的系统能够处理错误、适应环境的变化,并在面对意外挑战时仍维持运行,而不会崩溃或者产生不可预测的行为。
它是github上是openai公司开源的一个项目。 开发语言是python .
地址:github的主域名 + openai/whisper
官方的文档使用场景描述: Whisper是一个通用的语音识别模型。
它经过大量多样化音频数据的训练,并且还是一个多任务模型,可以进行多语言语音识别、语音翻译和语言识别。
处理流程或者模型图如下:
图中是whipser的处理过程。我标了4个小点,简单对齐一下:
log-Mel Spectrogram
是一种在语音处理中常用的特征表示方法,特别是在语音识别与分析任务中。它是Mel频谱(Mel Spectrogram)的对数版本,通常能更好地匹配人类的听觉感知特性,因为Mel刻度是对频率进行非线性变换,以模拟人耳对不同频率的响应。
在使用OpenAI的Whisper项目进行语音转文本任务时,log-Mel Spectrogram
可能作为语音信号的输入前处理步骤。Whisper 的模型在训练前会将语音信号转换成这种格式,因为它可以有效地捕捉到对于语音识别至关重要的特征,并降低环境噪音和其他不相关变量的影响。
在Whisper模型中,如果你想要处理音频文件进行语音识别,流程可能如下:
log-Mel Spectrogram
。这包括采样、窗函数应用、FFT、Mel滤波器组应用,最后获取对数Mel能量。log-Mel Spectrogram
会被提供给模型作为输入特征。log-Mel Spectrogram
提供了一种与人类听觉相匹配的特征表示。log-Mel Spectrogram
。"tokens in multitask training format" 在使用像 Whisper 这样的模型时,
引用的是如何在训练阶段以一种格式化的方式组织和表示数据,使得模型能同时学习多个任务。
多任务训练(Multitask Training)是机器学习中的一种技术,
旨在通过同时训练一个模型来执行多个相关任务,以达到提高总体性能和效率的目的。
在 Whisper 项目的背景下,这意味着模型不仅被训练用以转换语音到文本,
还可能包括其他任务,比如语言识别、情感分析等。
在多任务训练中,一个关键的挑战是如何在模型内部表示不同的任务,
以及如何向模型指示当前的输入数据对应于哪个特定任务。
这是通过使用特定的“tokens”来实现的,这些 tokens 作为数据输入的一部分,
用来指示模型当前处理的是哪种任务。
以 Whisper 为例,如果它被设计为处理多种任务(例如,同时进行语音识别和语言检测),
那么训练数据可能被格式化为包含特殊 tokens 的序列,
这些 tokens 明确指出每个数据样本的任务。
例如:
[语音识别]
开头的 token 作为提示,紧接着是转换成 log-Mel Spectrogram 的原始语音数据。
[语言识别]
开头,后跟相同的语音数据表示。虽然 Whisper 主要聚焦于将语音转换为文本,
但是将它想象成一个多任务学习的框架不难。
在这种情况下,训练数据将需要按照上述方式进行组织,
使得模型能够区分不同任务的数据并相应地调整其内部表示和输出。
多任务训练的好处包括:
模型的不同部分可以学习到在多个任务中通用的表示和特征,从而提高整体性能。
通过同时训练多个任务,可以节约时间和计算资源,相比单独训练每个任务。
虽然此说明提供了一个理论框架,目前 Whisper 主要专注于语音到文本的转换,
但未来的版本或者其他类似项目可能会探索多任务学习的潜力,
从而扩展其应用范围和提高效率。
一个Transformer序列到序列模型被训练用于各种语音处理任务,
包括多语言语音识别、语音翻译、口语识别和声活动检测。
这些任务被联合表示为一系列由解码器预测的标记,
使得单个模型能够替代传统语音处理流程中的许多阶段。
多任务训练格式使用一组特殊的标记作为任务指示符或分类目标。
想象一下,你在一个厨房里,你需要同时煮面条、煎鸡蛋和煮咖啡。
如果你一次只做一件事,那么要完成所有工作可能需要很长时间。
但是,如果你能学会同时处理这三件事,你就可以在更短的时间内做完。这就是所谓的“多任务处理”。
在Whisper项目中,这个比喻类似于我们让计算机学习如何同时处理多种语音相关的任务。
Whisper是一个被设计用来听懂人说的话并把它们写下来的程序。
现在,假设我们不仅想要它写下话,还想要它识别说话的人使用的是哪种语言,
甚至可能想要它能理解说话的人的感情状态。
为了让Whisper学会这些技能,我们需要采用一种特殊的训练方式,
即“多任务训练”。就像你需要知道何时该煮面条、煎鸡蛋、煮咖啡一样,
Whisper也需要知道它是在把语音转换成文本,还是在识别语言或感情。
我们是通过添加一些特别的标记或者符号(也就是“tokens”)来告诉它的。
这些标记好比是一个信号,告诉Whisper现在应该用它的哪一部分技能。
这样的训练方式可以让Whisper更加聪明,它不仅可以更好地完成每一项任务,
还可以学习到一些在所有任务中都有用的东西。
最终,它能更快更好地帮助我们处理语音,
就像一个经验丰富的厨师能够轻松地同时处理多道菜一样。
以下是你需要按照顺序执行的步骤,以确保Whisper能够正确安装在你的系统上。
确认Python版本:确保你的系统中安装了 Python 3.9.9。
确认PyTorch版本:你需要安装或者确认已安装 PyTorch 1.10.1 或其最新版本。你可以访问 PyTorch 官网来获取安装指南。
*安装rust : *
如果在安装过程中遇到tiktoken
的问题,可能需要安装 Rust。
可以根据 Rust 官方的开始页面进行安装,并且可能需要将 Rust 的路径添加到系统的 PATH 环境变量中,例如:
export PATH="$HOME/.cargo/bin:$PATH"
如果你发现了类似“No module named 'setuptools_rust'”的安装错误,你需要安装 setuptools_rust
:
pip install setuptools-rust
4.安装FFmpeg 。这是对不同操作系统的安装说明:
sudo apt update && sudo apt install ffmpeg
sudo pacman -S ffmpeg
5 .安装 Whisper
pip install -U openai-whisper
或者,如果你想直接从GitHub安装最新的代码库,可以使用以下命令:
pip install git+https://github.com/openai/whisper.git
如果你需要更新Whisper,可以使用:
pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git
概括来说,安装Whisper需要你确保 Python 和 PyTorch 环境的正确设置,
使用pip命令安装Whisper本身,确保系统中安装了 FFmpeg(用于处理音频文件),
以及可能需要的 Rust(对于一些底层编译处理)。
在安装过程中,遇到任何问题可以参考官方文档或者搜索相应的错误信息来找到解决方案。
有五种模型,其中四种提供了英文版本,英文版本的模型提供了速度和准确性的权衡。
下面是可用模型的名称及其相对于大型模型的大致显存需求和推理速度;
实际速度可能取决于许多因素,包括可用的硬件。
纯英语应用程序的.en模型往往表现得更好,尤其是对于小型应用程序。
在模型。我们观察到,小的模型显存差异变得不那么显著。
在模型选择上的表现也因语言有差异。
下面是对比表格:
Whisper支持多达100多种语言的语音识别,在 tokenizer.py 文件中列举出来了所有支持的语言 ,其中包括但不限于以下语言:
名词定义:
WER: 单词错误率
CER: 字符错误率
Common Voice 15和Fleurs数据集是两个语音及语言数据集,它们是用来训练和评估语音识别技术如Whisper等模型的工具
下图显示了按语言划分的large-v3和large-v2模型的性能分解,使用了在Common Voice 15和Fleurs数据集上评估的WER(单词错误率)或CER(字符错误率)
这个图说明对主流语言的错误率比较低。 后面随着版本是升级这个错误率会进一步降低。
假设我是一名开发人员,基于Whisper的官方文档,
以下是如何使用命令行来操作Whisper模型进行语音转录和翻译的概括:
可以通过--model
参数来指定使用哪个预训练模型。
例如,--model medium
会选择中等大小的模型进行转录。
如果不指定模型,Whisper默认会使用小模型,这在转录英语时通常效果不错。
whisper audio.flac --model medium
若要转录非英语的音频,可以使用--language
参数指定语言代码。
例如,--language Japanese
指令会让模型知道输入文件是日语。
whisper japanese.wav --language Japanese
如果你需要将非英语的语音内容转录并翻译成英语,可以通过添加--task translate
参数来实现。
whisper japanese.wav --language Japanese --task translate
Whisper支持多种音频文件格式,包括.flac
、.mp3
和.wav
等。
在命令行中,直接指定文件名和格式即可。
whisper audio.flac
whisper audio.mp3
whisper audio.wav --model medium
若需要查看Whisper支持的所有参数选项,可以使用whisper --help
命令。
whisper --help
通过上述概括,
可以理解Whisper提供了灵活的命令行界面来转录和翻译语音文件。
作为开发人员,可以根据实际需要选择合适的模型、指定语言,甚至执行翻译任务,
以适应不同的应用场景和需求。
此外,通过查阅帮助文档可以更加深入地了解不同的命令行选项,从而充分利用Whisper模型的功能。
简单使用:
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(result["text"])
精细化使用:
import whisper model = whisper.load_model("base") # load audio and pad/trim it to fit 30 seconds audio = whisper.load_audio("audio.mp3") audio = whisper.pad_or_trim(audio) # make log-Mel spectrogram and move to the same device as the model mel = whisper.log_mel_spectrogram(audio).to(model.device) # detect the spoken language _, probs = model.detect_language(mel) print(f"Detected language: {max(probs, key=probs.get)}") # decode the audio options = whisper.DecodingOptions() result = whisper.decode(model, mel, options) # print the recognized text print(result.text)
使用python有优势,就是它的主框架是python写的,
部分场景可以直接调整python代码,修改主框架。
可以在 https://github.com/openai/whisper/discussions/categories/show-and-tell 页面找到,
开源世界非常神奇 ,例如web演示,与其他工具的集成,不同平台的端口等。
Whisper的代码和模型权重在MIT许可下发布。详见LICENSE。
电话录音转换为文本对话信息。
处理脚本:
#!/bin/bash # 目录路径 input_dir="/sftp/openai/inwav" output_dir="/sftp/openai/outjson" log_file="/sftp/openai/logs/log.txt" # 并发度 concurrency=1 # HTTP请求的URL request_url="https://xx-qa.cn/api/phone/crm6/trans/callback?fileName=" request_url2="https://xx.cn/api/phone/crm6/trans/callback?fileName=" # 处理单个文件的函数 process_file() { file_path="$1" file_name=$(basename -- "$file_path") output_file="${output_dir}/${file_name%.*}.json" echo "$file_path , $file_name , $output_file" # 如果输出文件已存在,则跳过处理 if [ -f "$output_file" ]; then echo "Output for $file_name already exists, skipping..." | tee -a "$log_file" rm "$file_path" # 将处理结果通过HTTP GET请求发送 response=$(curl -s "$request_url$file_name") echo "Server $request_url$file_name: response: $response" | tee -a "$log_file" response2=$(curl -s "$request_url2$file_name") echo "Server $request_url2$file_name response: $response2" | tee -a "$log_file" return fi file_size=$(stat -c%s "$file_path") model="small" # 记录开始时间 start_time=$(date +%s) # 执行whisper命令 whisper "$file_path" --model "$model" --output_format json --output_dir "$output_dir" # 记录结束时间 end_time=$(date +%s) # 计算耗时 duration=$((end_time - start_time)) log_message="Processed $file_name using $model model in $duration seconds." echo "$log_message" | tee -a "$log_file" echo "---------------------------------------" | tee -a "$log_file" # 将处理结果通过HTTP GET请求发送 response=$(curl -s "$request_url$file_name") echo "Server $request_url$file_name: response: $response" | tee -a "$log_file" response2=$(curl -s "$request_url2$file_name") echo "Server $request_url2$file_name response: $response2" | tee -a "$log_file" # 删除原wav文件 rm "$file_path" # 日志分隔符 echo "---------------------------------------" | tee -a "$log_file" } export -f process_file export input_dir export output_dir export log_file export request_url export request_url2 while true; do # 查找所有wav文件 files=($(find "$input_dir" -name "*.wav")) # 如果目录下没有wav文件,则休眠30秒 if [ ${#files[@]} -eq 0 ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - No wav files to process. Sleeping for 30 seconds..." >> "$log_file" sleep 30 else # 顺序处理文件 for next_file in "${files[@]}"; do process_file "$next_file" done fi done
目前输入是通过sftp的方式上传到whisperx服务器,通道可能不太稳定。
后面按照体系结构设计的流程去调整;即监听redis消息,可以把语言带过来,进一步提高效率。
然后,结果的输出,暂时没有对接S3, 也是通过SFTP返回结果的;
要设计一个电话记录转换文本的数据表模型,我们需要考虑几个关键要素:
保存录音文件的基本信息,如文件名、文件路径、录音时长等。
追踪录音到文本转换的状态(例如:待转录、进行中、已完成、失败)。
保存转录文本的结果以及可能的错误信息。
记录是否已经通知Java程序以及接口调用的相关信息。
记录每个步骤的时间,如创建时间、转录开始时间、转录结束时间、通知时间。
基于以上要素,我们可以设计一个简单的数据表模型:
CREATE TABLE call_transtxt ( id INT AUTO_INCREMENT PRIMARY KEY, audio_filename VARCHAR(255) NOT NULL, audio_file_path VARCHAR(255) NOT NULL, audio_duration INT DEFAULT NULL, -- 可以存储录音时长(单位:秒) transcript_status ENUM('pending', 'in_progress', 'completed', 'failed') NOT NULL DEFAULT 'pending', transcript_text TEXT, -- 存储转录结果 error_message VARCHAR(255), -- 存储转录失败的错误信息 notify_status ENUM('not_notified', 'notifying', 'notified', 'notification_failed') NOT NULL DEFAULT 'not_notified', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, transcription_started_at DATETIME, transcription_completed_at DATETIME, notified_at DATETIME, INDEX idx_audio_filename (audio_filename), INDEX idx_transcript_status (transcript_status), INDEX idx_notify_status (notify_status) );
在这个表中:
id
是主键,用于唯一标识每条记录。audio_filename
和 audio_file_path
存储了录音文件的名称和路径。audio_duration
是可选的,如果你有录音时长的具体信息,可以存储在这个字段中。transcript_status
标记转录的状态,这对于追踪进度很有帮助。transcript_text
存储实际的转录文本。error_message
用于记录转录失败时的错误信息。notify_status
用于跟踪是否已经向Java程序发出通知。created_at
、transcription_started_at
、transcription_completed_at
和 notified_at
分别用于记录不同阶段的时间点。有了这张表,Java程序可以轮询数据库或通过其他机制(如数据库触发器等)来获取转录状态的更新,以及一旦转录完成或失败时的通知。
转录完成后,Java程序可以从 transcript_text
字段获取结果并记录到对应的表中。
如果需要处理更多的业务逻辑,比如用户信息、权限验证等,
可能还需要设计额外的表格来满足这些需求。
其它个业务关联的,需要在业务代码中进行。但是存储的信息已经够了。
处理电话录音文件:
转换文本效果:
上图概要是跟AI结合之后的效果。
AI质检效果:
一句话小结:AI时代结合Whisper可以低成本灵活的实现语音转文本。
通过业务场景问题引入了对语音转文本的需求,然后基于市面上的语音转文本产品做了选型,选定了之后做了详细的了解,并结合业务项目进行了实践。
要做到实时的语音转文本,代价目前还是比较高的,看了各种云计算厂商的价格都比较高。
跑语音转文本需要GPU,即显存。目前在aws上售价大概 4000美金。
自建从长期来看是节约成本的。
这些技术的发展将大幅提高客户体验,降低企业运营成本,并提升解决问题的效率,最终推动全球客服行业的转型和升级。
原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。