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 到此结束!

目录
相关文章
|
4天前
|
人工智能 机器人 API
2026年新手小白部署OpenClaw(Clawdbot)快速接入钉钉教程,零基础解锁 AI 高效协同办公
2026年AI Agent技术持续迭代,OpenClaw(原Clawdbot、Moltbot)作为开源、本地优先的全能AI智能代理平台,凭借强大的任务自动化执行与多渠道集成能力脱颖而出——它不仅能实现自然语言对话,更能深度整合办公场景需求,完成邮件整理、会议纪要生成、待办同步、多工具协同等实用任务,兼容Qwen、GPT、Claude等多模型,堪称新手小白与轻量团队的“专属数字员工”[1]。阿里云专为零基础用户优化的OpenClaw一键部署方案,通过预置专属应用镜像,彻底简化了传统部署的复杂流程,无需专业编程基础、无需手动调试依赖环境,新手仅需20分钟即可完成部署,后续快速接入钉钉,就能实现“钉
203 7
|
4天前
|
人工智能 弹性计算 运维
小白也能上手!阿里云推出 OpenClaw 极速简易部署方案
阿里云OpenClaw是开源本地优先AI智能体平台,支持邮件处理、周报生成、资料查询、代码编写等任务,数据全留本地,保障隐私。技术小白也能通过阿里云轻量服务器“一键部署”,几分钟即可拥有专属AI数字员工。
93 15
|
1月前
|
存储 数据采集 弹性计算
面向多租户云的 IO 智能诊断:从异常发现到分钟级定位
当 iowait 暴涨、IO 延迟飙升时,你是否还在手忙脚乱翻日志?阿里云 IO 一键诊断基于动态阈值模型与智能采集机制,实现异常秒级感知、现场自动抓取、根因结构化输出,让每一次 IO 波动都有据可查,真正实现从“被动响应”到“主动洞察”的跃迁。
305 59
|
19天前
|
人工智能 JSON API
手把手教你配置 AI 调度官,实现任务自动化流转
本文详解2026年企业级AI调度官(AI Orchestrator)实战配置:以多智能体协同为核心,构建“意图理解—动态规划—智能分发”闭环系统,覆盖四层架构、任务拆解、反思审计与跨境电商落地场景,助你实现真正自动化业务流转。(239字)
115 9
|
24天前
|
机器学习/深度学习 自然语言处理 算法
大模型对齐实战:PPO算法的原理与应用实践
本文深入浅出讲解PPO算法在大模型偏好对齐中的应用,涵盖核心原理、三大环节(SFT、RM、PPO)、实操步骤与效果评估。结合LLaMA-Factory工具,手把手带新手完成智能客服模型微调,助力打造贴合人类偏好的AI应用,是入门强化学习对齐的实用指南。
|
17天前
|
弹性计算 网络协议 应用服务中间件
99计划:阿里云99元服务器ECS经济型e实例及性能测,你关心的问题都在这!
阿里云“99计划”推出超值ECS经济型e实例:2核2G、3M固定带宽、40G ESSD云盘,首年及续费均仅99元/年(限活动期内,截至2027.3.31),新老用户实名认证后均可购,不限流量、独享IP,适合博客、WordPress等轻量应用。
104 8
|
17天前
|
人工智能 算法 测试技术
AI能否实现APP自动化测试?「墨迹天气」案例完整验证
APP自动化,真的能被AI接住吗?最近,我们用一款真实App——墨迹天气,完成了从“添加”到“删除”城市的全流程自动化测试。这不是脚本拼接的Demo,而是AI测试智能体像真人一样理解意图、规划路径、执行操作,并生成可回溯的完整报告。本次演示直击一个核心问题:AI能否将测试工程师从重复、明确的执行工作中解放出来?结果,或许比你想象的更近一步。
|
18天前
|
Linux 开发者 iOS开发
IntelliJ IDEA 的「闪电操作」:这些 Quick 技巧让你编码快如疾风
本文详解 IntelliJ IDEA 六大高效“Quick”技巧:Quick Fix(Alt+Enter)、Quick Doc(Ctrl+Q)、Quick Evaluate(Alt+F8)、Quick Switch Scheme(Ctrl+`)、Quick Definition(Ctrl+Shift+I)及 Live Templates。助你减少鼠标操作,提升编码流畅度与思维连贯性。(239字)
148 8
|
24天前
|
传感器 人工智能 监控
2026:智能体元年 —— 从“对话框”到“数字物种”的进化跃迁
如果说 2023 年是“大模型”的惊艳亮相,那么 2026 年将被定义为 Agent(智能体)元年。AI 的形态正在发生质变:它不再只是一个被动回答问题的 Chatbot,而是进化为具备感知、决策、行动能力的自主“数字物种”。本文将综合技术架构与科学范式,深度拆解这一场正在发生的生产力革命。
234 11
|
4天前
|
机器学习/深度学习 存储 人工智能
[大模型实战 03] 拆解 Transformers:从原理图解到 HuggingFace Transformers 实战
本文图解Transformer核心原理(注意力机制+位置编码),在Kaggle双T4 GPU环境下实战拆解Hugging Face“铁三角”(Config/Tokenizer/Model),并详解Temperature与Top_p两大生成调控参数,助你真正理解并掌控大模型推理。
105 10
[大模型实战 03] 拆解 Transformers:从原理图解到 HuggingFace Transformers 实战