docker 下部署 纯CPU的Nway ASR & TTS

简介: 本方案提供基于Docker的纯CPU版Nway语音识别(ASR)与合成(TTS)一体化部署:含定制Dockerfile、多服务启停脚本及Flask HTTP网关,支持RESTful API调用,开箱即用,无需GPU,适配x86 CPU环境。(239字)

docker 下部署 纯CPU的Nway ASR & TTS

首先先下载包

需要包私我

将下载的包解压,进入目录创建下面三个相关文件
1、准备下面三个文件
准备Dockerfile

FROM ubuntu:22.04
# 设置非交互式安装
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    ca-certificates \
    libgcc-s1 \
    python3 \
    python3-pip \
    python3-venv \
    net-tools \
    && rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 复制应用程序文件
COPY . .
# 安装Python依赖(添加requests)
RUN pip3 install flask werkzeug requests
# 设置权限
RUN chmod +x nasr-server nasr-client ntts-server ntts-client start_services.sh
# 设置环境变量
ENV LD_LIBRARY_PATH=/app
ENV PYTHONPATH=/app

EXPOSE 8089 8090 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
    CMD netstat -tuln | grep -q -E ':(8089|8090|8080)' || exit 1

CMD ["./start_services.sh"]

2、启动脚本

#!/bin/bash

echo "=== 启动脚本开始 ==="
echo "当前目录: $(pwd)"
echo "文件列表:"
ls -la

echo "=== 检查可执行文件 ==="
file nasr-server ntts-server

echo "=== 设置环境变量 ==="
export LD_LIBRARY_PATH=/app
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"

echo "=== 启动ASR服务 ==="
./nasr-server &
ASR_PID=$!
echo "ASR服务PID: $ASR_PID"

echo "=== 启动TTS服务 ==="  
./ntts-server &
TTS_PID=$!
echo "TTS服务PID: $TTS_PID"

echo "=== 等待服务启动 ==="
sleep 5

echo "=== 检查端口监听 ==="
netstat -tuln | grep -E ':(8089|8090)'

echo "=== 启动HTTP网关 ==="
python3 http_gateway.py &
GATEWAY_PID=$!
echo "HTTP网关PID: $GATEWAY_PID"

echo "=== 最终端口检查 ==="
sleep 3
netstat -tuln | grep -E ':(8089|8090|8080)'

echo "=== 所有服务已启动 ==="

# 等待服务运行
wait

3、python 应用

from flask import Flask, request, jsonify, send_file
import requests
import os
import tempfile
import uuid
from werkzeug.utils import secure_filename

app = Flask(__name__)

# 服务配置
ASR_SERVER = "http://localhost:8089"
TTS_SERVER = "http://localhost:8090"

@app.route('/api/health', methods=['GET'])
def health_check():
    """健康检查接口"""
    return jsonify({
   
        "status": "healthy",
        "services": {
   
            "asr": "running",
            "tts": "running"
        }
    })

@app.route('/api/asr/transcribe', methods=['POST'])
def transcribe_audio():
    """语音识别接口"""
    if 'audio' not in request.files:
        return jsonify({
   "error": "No audio file provided"}), 400

    audio_file = request.files['audio']

    # 保存临时文件
    temp_dir = tempfile.gettempdir()
    filename = secure_filename(f"{uuid.uuid4()}.wav")
    filepath = os.path.join(temp_dir, filename)
    audio_file.save(filepath)

    try:
        # 调用ASR服务
        result = os.popen(f"./nasr-client 127.0.0.1:8089 {filepath}").read().strip()

        return jsonify({
   
            "text": result,
            "status": "success"
        })
    except Exception as e:
        return jsonify({
   "error": str(e)}), 500
    finally:
        # 清理临时文件
        if os.path.exists(filepath):
            os.remove(filepath)

@app.route('/api/tts/synthesize', methods=['POST'])
def synthesize_speech():
    """语音合成接口"""
    data = request.get_json()
    if not data or 'text' not in data:
        return jsonify({
   "error": "No text provided"}), 400

    text = data['text']
    output_filename = data.get('filename', f"{uuid.uuid4()}.wav")

    try:
        # 调用TTS服务
        output_path = f"/tmp/{output_filename}"
        command = f'./ntts-client 127.0.0.1:8090 --input "{text}" --output {output_path}'
        os.system(command)

        if os.path.exists(output_path):
            return send_file(output_path, as_attachment=True, download_name=output_filename)
        else:
            return jsonify({
   "error": "TTS synthesis failed"}), 500

    except Exception as e:
        return jsonify({
   "error": str(e)}), 500

@app.route('/api/tts/synthesize_base64', methods=['POST'])
def synthesize_speech_base64():
    """语音合成接口(返回base64)"""
    import base64

    data = request.get_json()
    if not data or 'text' not in data:
        return jsonify({
   "error": "No text provided"}), 400

    text = data['text']

    try:
        # 调用TTS服务
        temp_file = f"/tmp/{uuid.uuid4()}.wav"
        command = f'./ntts-client 127.0.0.1:8090 --input "{text}" --output {temp_file}'
        os.system(command)

        if os.path.exists(temp_file):
            with open(temp_file, 'rb') as f:
                audio_data = f.read()
            os.remove(temp_file)

            return jsonify({
   
                "audio_base64": base64.b64encode(audio_data).decode('utf-8'),
                "status": "success"
            })
        else:
            return jsonify({
   "error": "TTS synthesis failed"}), 500

    except Exception as e:
        return jsonify({
   "error": str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=False)

4、构建并运行容器

# 构建镜像
docker build -t nway-audio-ai .

# 运行新容器
docker run -d \
  -p 8080:8080 \
  -p 8089:8089 \
  -p 8090:8090 \
  --name nway-audio-ai \
  nway-audio-ai
# 查看日志
docker logs -f nway-audio-ai
最后测试:
# 测试HTTP网关
curl http://localhost:8080/api/health

# 测试ASR服务
curl -X POST http://localhost:8080/api/asr/transcribe \
  -F "audio=@test.wav"

# 测试TTS服务
curl -X POST http://localhost:8080/api/tts/synthesize \
  -H "Content-Type: application/json" \
  -d '{"text": "测试语音合成"}'

docker 下部署 纯CPU的Nway ASR & TTS 到此结束!

目录
相关文章
|
2月前
|
缓存 网络安全 语音技术
docker安装部署FunASR
本指南详解FunASR在线语音识别服务的外网部署与内网迁移全流程:先在外网拉取Docker镜像、自动下载模型并启动服务(端口10095),验证成功后,将镜像和缓存模型打包导出;再于内网服务器导入镜像、解压模型、挂载运行,全程禁用SSL,支持热词与标点恢复,开箱即用。
659 3
|
5天前
|
人工智能 自然语言处理 机器人
拆解OpenClaw的安装步骤:只需3步骤,先选OpenClaw镜像,然后配置API Key,最后接入通讯软件
本文为阿里云轻量服务器新手提供OpenClaw零基础部署教程,详解如何一键部署、配置百炼API Key(推荐Coding Plan套餐),并集成QQ机器人,实现自然语言交互。含端口配置、WebUI访问及费用说明(轻量服务器9.9元/月起,模型调用享新人免费额度)。
541 128
|
1月前
|
人工智能 弹性计算 运维
小白也能上手!阿里云推出 OpenClaw 极速简易部署方案
阿里云OpenClaw是开源本地优先AI智能体平台,支持邮件处理、周报生成、资料查询、代码编写等任务,数据全留本地,保障隐私。技术小白也能通过阿里云轻量服务器“一键部署”,几分钟即可拥有专属AI数字员工。
277 15
|
1月前
|
Linux 虚拟化 UED
VMware-workstation-full-12.5.7-5813279安装步骤详解(附虚拟机创建与常见问题)
VMware Workstation 12.5.7 完整版(Windows)是一款专业虚拟机软件,支持在一台电脑上运行多台虚拟系统(如Linux、Win7/10测试版),适用于开发、测试与学习。安装约400MB,需Win7+ 64位系统、4GB+内存,务必以管理员身份运行。操作简洁,支持快照、克隆、拖拽传文件等功能。(239字)
|
1月前
|
并行计算 API Docker
Docker+vLLM内网离线部署Qwen3 流程
本教程详解如何在A10四卡内网环境中,通过Docker+ vLLM离线部署Qwen3-32B/Qwen3-VL-30B-Instruct大模型。涵盖环境准备、镜像离线导入、模型下载、容器启动及参数调优,支持FP8/KV缓存/张量并行等高性能配置,助力安全高效私有化推理
1623 5
|
1月前
|
人工智能 机器人 API
2026年新手小白部署OpenClaw(Clawdbot)快速接入钉钉教程,零基础解锁 AI 高效协同办公
2026年AI Agent技术持续迭代,OpenClaw(原Clawdbot、Moltbot)作为开源、本地优先的全能AI智能代理平台,凭借强大的任务自动化执行与多渠道集成能力脱颖而出——它不仅能实现自然语言对话,更能深度整合办公场景需求,完成邮件整理、会议纪要生成、待办同步、多工具协同等实用任务,兼容Qwen、GPT、Claude等多模型,堪称新手小白与轻量团队的“专属数字员工”[1]。阿里云专为零基础用户优化的OpenClaw一键部署方案,通过预置专属应用镜像,彻底简化了传统部署的复杂流程,无需专业编程基础、无需手动调试依赖环境,新手仅需20分钟即可完成部署,后续快速接入钉钉,就能实现“钉
921 7
|
7天前
|
人工智能 搜索推荐 数据库
语义重构与信任锚点:Geo优化中知识图谱的战略价值与构建路径
本文探讨AI搜索时代下Geo优化的核心——知识图谱构建,解析于磊老师首创的“两大核心+四轮驱动”方法论,涵盖人性化Geo、内容交叉验证及E-E-A-T实体化等实践路径,助力企业提升AI索引精度与获客效率。(239字)
68 18
|
5天前
|
人工智能 测试技术 微服务
AI 大型项目编程流程
本项目采用Claude与Codex协同开发模式:先由Claude定稿需求、竞品分析、生成技术文档;再由Codex分周期开发、自动生成/更新流程文档,并循环接受Claude评估优化;老项目则支持微服务级模块化改造与迭代测试,实现高效、可靠、可追溯的AI驱动开发闭环。(239字)
97 7
|
1月前
|
缓存 NoSQL PHP
秒杀活动时系统在干什么 PHP 高并发场景优化指南
本文详解PHP应对秒杀高并发的全链路优化方案:通过负载均衡+自动扩容分担流量,Redis缓存热点数据减压DB,分库分表、读写分离与连接池提升数据库性能,JWT+Redis实现无状态会话,Kafka事件驱动保障库存一致性。240字
104 16
|
2天前
|
人工智能 IDE 程序员
Agent Apps:Agent 时代,大家都在造工具箱,但真正缺的是“工作台”
Agent时代,工具层出不穷,但真正缺失的是Agent的“工作台”——Agent App。它不是工具集合、技能包或大一统Agent,而是为AI构建可操作、有状态、带上下文与视图的原生工作环境,让Agent真正“上岗干活”。
122 8
Agent Apps:Agent 时代,大家都在造工具箱,但真正缺的是“工作台”

热门文章

最新文章